首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用java驱动程序更新mongo db中的文档字段?

如何使用java驱动程序更新mongo db中的文档字段?
EN

Stack Overflow用户
提问于 2010-08-27 08:25:08
回答 6查看 48.9K关注 0票数 18

参考文献:

对于mongo db来说,这仍然是个新手,但我正在尝试更新集合中现有文档的一部分……不幸的是,上面的链接没有更新示例。

从本质上讲,我只是希望能够:

  1. 将新字段添加到文档
  2. 将文档的现有字段更新为新值

下面是我的代码(Grails + Groovy + Java + MongoDB + java驱动程序):

代码语言:javascript
复制
def shape = mongo.shapes.findOne(new BasicDBObject("data", "http://www.foo.com")); // get the document
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("isProcessed", 0));  // add a new "isProcessed" field set to 0
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("data", "http://www.bar.com"));

这几乎撞到了整个物体。我可能会尝试修改原始的shape对象,然后对其运行更新。但在此之前,是否有人有过仅更新单个字段(而不是整个文档)的经验?

编辑:

我只是尝试了一下,并成功地通过发送整个对象的新字段和/或更新字段进行了更新,这是可行的。我想知道驱动程序是否足够聪明,只更新最小的更改子集,或者只是盲目地更新整个事情?(在下面的例子中,它是只更新整个网络的foo字段,还是更新整个shape文档?)

代码:

代码语言:javascript
复制
def shape = mongo.shapes.findOne(); // get the first shape to use as a base
shape.removeField("_id");  // remove the id field
shape.put("foo","bar");  // add a new field "foo"
mongo.shapes.insert(shape);  // insert the new shape
def shape2 = mongo.shapes.findOne(new BasicDBObject("foo", "bar"));  // get the newly inserted shape (and more importantly, it's id)
shape2.put("foo", "bat");  // update the "foo" field to a new value
mongo.shapes.update(new BasicDBObject("_id", shape2._id), shape2);  // update the existing document in mongo
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-27 16:46:31

我想知道驱动程序是否足够聪明,只更新最小的更改子集,或者只是盲目地更新整个东西?

不,如果您使用“普通”更新方法,整个对象将通过网络发送。我怀疑数据库服务器本身将足够聪明,如果可能的话,只更新必要的索引(而不是未更改的索引)(即,对象可以在适当的位置更新,而不必移动,因为它增长得太快)。

你能做的就是使用“原子更新修饰符”函数。Java文档对它们有点轻描淡写,但由于驱动程序只传输JSON,非Java教程中的内容应该可以工作,例如:

代码语言:javascript
复制
shapes.update((DBObject)JSON.parse(    "{ 'foo' : 'bar'}"),  
    (DBObject) JSON.parse(          "{ '$set' : { 'foo': 'bat'}}")   );
票数 12
EN

Stack Overflow用户

发布于 2010-08-27 16:45:23

找到了an example here,它似乎显示了更新调用的用法。因此,对于你的例子,我相信这样的东西应该可以工作?

代码语言:javascript
复制
// Find an object
def shape2 = mongo.shapes.findOne( new BasicDBObject( 'foo', 'bar' ) )
// And update the foo field from 'bar' to 'bat'
mongo.shapes.update( shape2, new BasicDBObject( '$set', new BasicDBObject( 'foo', 'bat' ) ) )

编辑

你可以使用一个类别来以一种更好的方式构建你的BasicDBObjects ...

下面的代码可能会这样做:

代码语言:javascript
复制
class BasicDBObjectMapBuilder {
  static String toDbObj( String s ) { s }
  static BasicDBObject toDbObj( Map m ) {
    m.inject( null ) { r, it -> new BasicDBObject( it.key, it.value.toDbObj() ) }
  }
}

use( BasicDBObjectMapBuilder ) {
  def shape2 = mongo.shapes.findOne( new BasicDBObject( 'foo', 'bar' ) )
  // And update the foo field from 'bar' to 'bat'
  mongo.shapes.update( shape2, [ '$set':[ 'foo', 'bat' ] ].toDbObj() )
}

我还没有测试过这个。

编辑2

实际上,BasicDBObject是一个地图,所以你应该能够做到:

代码语言:javascript
复制
  mongo.shapes.update( shape2, [ '$set':[ 'foo', 'bat' ] ] as BasicDBObject )

不需要构建器

票数 11
EN

Stack Overflow用户

发布于 2016-01-18 23:58:23

这篇文章中的许多答案都是使用旧版本的Mongo Java驱动程序。如果您使用的是较新版本的Java Driver (v3.0+),那么首选方法似乎是使用Document对象而不是DBObject接口。

下面是一个示例:

代码语言:javascript
复制
MongoClient client = new MongoClient();
MongoCollection<Document> fooCollection = client.getDatabase("test").getCollection("foo");

Bson filter = Filters.eq("_id", "123d45678c467bb433c99f99");
Bson updates = Updates.set("isFoo", true);
fooCollection.findOneAndUpdate(filter, updates);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3580529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档