我将MongoDB与官方Java驱动程序(版本2.6.3)一起使用.我有一个包含购物 list 的MongoDB集合.购物 list 的格式如下

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

现在我想用update()method DBCollection向列表中添加一个新项.但无论我try 什么,它都不会起作用,尽管它告诉我

{ "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.我还try 用BasicDBObjectBuilderJSON.parse()创建update()个参数,但没有任何区别.

我还查看了其他帖子,try 了谷歌搜索,但没有结果.我做错了什么?

谢谢你的帮助

推荐答案

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

shoppingLists.save( shoppingList );

我现在在另一个论坛上读到,从数据库中检索到的对象随后不会与数据库同步(现在对我来说听起来有点合乎逻辑:).所以每次我都会自己重写这些变化.移除上面的线后,它工作了:)

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

Mongodb相关问答推荐

使用mongosh将大型json文件插入到mongo集合中

MongoDB-如何过滤和获取数组字段中的最新数据

MongoDB 在一个聚合中包含多个组

MongoDB 根据最新日期查询多个不同的值

MongoDB 聚合 - 条件 $lookup 取决于字段是否存在

在运算符 $map 中嵌入运算符 $exists

MongoDB聚合 - 用另一个数组过滤数组

使用绝对类型在 Typescript 中编写 Mongoose 的类型化模型和模式的类和接口

findOneAndUpdate 和 findOneAndReplace 有什么区别?

MongoDB 使用自定义表达式或函数进行排序

SELECT 字段 AS `anothername` 的 mongodb 等效项

MongoDB 文档操作是原子的和隔离的,但它们是否一致?

mongodb 中的 --bindip 配置选项有什么作用?

MongoDB插入引发重复键错误

`fields cannot be identical'和''` mongoimport错误

使用 Mongoid 和 Ruby 查询最近 30 天的日期范围?

Django admin 和 MongoDB,可能吗?

TypeError: object of type 'Cursor' has no len()

将 MongoCursor from ->find() 转换为数组

Meteor订阅不更新集合的排序顺序