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

时间:2011-07-23 19:23:44

标签: java arrays mongodb

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

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

现在,我想使用update() DBCollection方法将新项目添加到列表中。但无论我尝试什么它都行不通,虽然它告诉我

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

newShoppingItemBasicDBObject,其中包含新项目的数据。我还尝试使用update()BasicDBObjectBuilder创建JSON.parse()参数,但这没有任何区别。

我也看过其他帖子,试过googleing,但无济于事。我做错了什么?

感谢您的帮助! 奥利弗

1 个答案:

答案 0 :(得分:10)

是的,上面的代码完全正常。我现在知道我的错误在哪里。我想做防弹,所以我认为最好在DBCollection末端使用save()并明确保存购物清单DBObject:

shoppingLists.save( shoppingList );

我现在在其他论坛中读到,从数据库中检索到的对象之后不会与数据库同步(现在听起来对我来说是合乎逻辑的:))。所以我每次都会自己覆盖这些变化。删除上面的行后,它工作:)

所以一条重要规则:更新DBCollection时 - 会直接发送到数据库! - 请勿在更新前保存您查询的DBObject!它会覆盖您的更新!