参考文献:
对于mongo db来说还算是新手,但是我正在尝试更新集合中现有文档的一部分…不幸的是,上面的链接没有更新示例。
本质上,我只希望能够:
这是我的代码(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
我想知道驱动程序是否足够聪明,只能更新最小的更改子集,还是只是盲目地更新整个事情?
不,如果您使用“常规”更新方法,则整个对象将通过网络发送。我怀疑数据库服务器本身将足够聪明,仅在可能的情况下仅更新必要的索引(而不是未更改的索引)(即,对象可以在适当的位置更新并且不必移动,因为它也增长了)许多)
您可以使用“原子更新修饰符”功能。Java文档对它们有所帮助,但是由于驱动程序只是传输JSON,因此非Java教程中的内容应该可以工作,例如:
shapes.update((DBObject)JSON.parse( "{ 'foo' : 'bar'}"), (DBObject) JSON.parse( "{ '$set' : { 'foo': 'bat'}}") );