使用Java驱动程序更新MongoDB中的数组

20

我正在使用官方的Java驱动程序(版本为2.6.3)与MongoDB一起使用。我有一个包含购物清单的MongoDB集合。购物清单的格式如下:

{ "_id" : { "$oid" : "4e2af1f43f8de96494d5271d"} ,
  "name" : "default" ,
  "items" : [ { "description" : "Cheese" , "quantity" : 1 , "unit" : "kg"} ,
              { "description" : "Water" , "quantity" : 3 , "unit" : "bottle"} ] }

现在我想使用DBCollectionupdate()方法向列表中添加新项,但是无论我尝试什么,它都不起作用,虽然它告诉我:

{ "updatedExisting" : true , "n" : 1 , "connectionId" : 63 , "err" :  null  , "ok" : 1.0}

我的代码执行以下操作:

    BasicDBObject updateQuery = new BasicDBObject();
    updateQuery.put( "name", "default" );

    BasicDBObject updateCommand = new BasicDBObject();
    updateCommand.put( "$push", new BasicDBObject( "items", newShoppingItem ) );
    WriteResult result = shoppingLists.update( updateQuery, updateCommand, true, true );

newShoppingItem 是一个 BasicDBObject,它包含了新项目的数据。我还尝试使用 BasicDBObjectBuilderJSON.parse() 来创建 update() 参数,但这并没有什么区别。

我也查看了其他帖子,尝试了谷歌搜索,但都没能解决问题。我错在哪里了?

感谢任何帮助!
Oliver


我使用MongoDB 2.5.3驱动程序运行了完全相同的代码,并且它正常工作。确保您正在查找正确的数据库。 - Justin Thomas
这对我来说非常有用,因为它帮助我更好地理解Mongo Java驱动程序中有些晦涩的语法。谢谢! - jsh
1个回答

10

是的,上面的代码完全正常。我现在知道我的错误在哪里了。我想要做到无懈可击,所以我认为最好在最后使用 save() 在 DBCollection 上并显式保存购物清单 DBObject:

shoppingLists.save( shoppingList );

我现在在某个论坛上读到了这样一个消息:从数据库中检索出的对象在之后不会与数据库同步(现在听起来有点合理)。因此,我每次都自己覆盖更改。删除上面的那行代码后,它就可以正常工作了 :)

所以有一个重要的规则:当您更新DBCollection时 - 这直接发送到数据库!- 不要保存在更新之前查询的DBObject!它将覆盖您的更新!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接