使用Java驱动程序更新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"} ] } 

现在我想使用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()参数,但它没有任何区别。

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

谢谢你的帮助!
奥利弗

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

 shoppingLists.save( shoppingList ); 

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

所以一条重要的规则是:更新DBCollection – 这会直接发送到数据库! – 不要保存在更新之前查询的DBObject ! 它会覆盖您的更新!