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

2022-09-02 10:53:20

我正在使用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 );

newShoppingItem是包含新项的数据的 。我也尝试使用 和 创建参数,但这没有任何区别。BasicDBObjectupdate()BasicDBObjectBuilderJSON.parse()

我也看了一下其他帖子,尝试谷歌,但无济于事。我做错了什么?

感谢您的任何帮助!
奥利弗


答案 1

是的,上面的代码工作得很好。我现在知道我的错误在哪里了。我想做到防弹,所以我认为最好在最后的DBCollection上使用save()并显式保存购物清单DBObject:

shoppingLists.save( shoppingList );

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

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


答案 2