小编典典

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

java

参考文献:

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

本质上,我只希望能够:

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

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

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"));

这几乎掩盖了整个对象…我可以尝试仅修改原始形状对象,然后在其上运行更新。但是在那之前,有 没有人有只更新单个字段(而不是整个文档)的经验?

编辑:

我只是尝试了一下,并且能够通过将整个对象与新的和/或更新的字段一起发送来成功更新,并且有效。我想知道驱动程序是否足够聪明,只能更新最小的更改子集,还是只是盲目地更新整个事情?(在以下情况下,它只是更新导线或整个形状文档中的foo字段吗?)

码:

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

阅读 208

收藏
2020-10-12

共1个答案

小编典典

我想知道驱动程序是否足够聪明,只能更新最小的更改子集,还是只是盲目地更新整个事情?

不,如果您使用“常规”更新方法,则整个对象将通过网络发送。我怀疑数据库服务器本身将足够聪明,仅在可能的情况下仅更新必要的索引(而不是未更改的索引)(即,对象可以在适当的位置更新并且不必移动,因为它也增长了)许多)

您可以使用“原子更新修饰符”功能。Java文档对它们有所帮助,但是由于驱动程序只是传输JSON,因此非Java教程中的内容应该可以工作,例如:

shapes.update((DBObject)JSON.parse(    "{ 'foo' : 'bar'}"),  
    (DBObject) JSON.parse(          "{ '$set' : { 'foo': 'bat'}}")   );
2020-10-12