mongodb - 如何更新文档数组中的对象(嵌套更新)

假设我们有以下集合,我对此没有几个问题:

{
    "_id" : ObjectId("4faaba123412d654fe83hg876"),
    "user_id" : 123456,
    "total" : 100,
    "items" : [
            {
                    "item_name" : "my_item_one",
                    "price" : 20
            },
            {
                    "item_name" : "my_item_two",
                    "price" : 50
            },
            {
                    "item_name" : "my_item_three",
                    "price" : 30
            }
    ]
}
  1. 我想提高 "item_name":"my_item_two"的价格如果它不存在,它应该附加到 "items"数组中。

  2. 如何同时更新两个字段?例如,增加“my_item_three”的价格,同时增加“total”(具有相同的值)。

我更喜欢在 MongoDB 端执行此操作,否则我必须在客户端 (Python) 中加载文档并构建更新的文档并将其替换为 MongoDB 中的现有文档。

这是我尝试过的并且工作正常如果对象存在:

db.test_invoice.update({user_id : 123456 , "items.item_name":"my_item_one"} , {$inc: {"items.$.price": 10}})

但是,如果 key 不存在,它什么也不做。 此外,它只更新嵌套对象。此命令也无法更新“总计”字段。

最佳答案

对于问题 #1,让我们将其分为两部分。首先,增加任何“items.item_name”等于“my_item_two”的文档。为此,您必须使用位置“$”运算符。比如:

 db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } , 
                {$inc : {"items.$.price" : 1} } , 
                false , 
                true);

请注意,这只会增加任何数组中第一个匹配的子文档(因此,如果数组中有另一个文档的“item_name”等于“my_item_two”,它将不会增加)。但这可能是你想要的。

第二部分比较棘手。我们可以将新项目推送到没有“my_item_two”的数组中,如下所示:

 db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} , 
                {$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
                false , 
                true);

对于您的问题 #2,答案更简单。要在包含“my_item_three”的任何文档中增加 item_three 的总计和价格,您可以同时在多个字段上使用 $inc 运算符。比如:

db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
               {$inc : {total : 1 , "items.$.price" : 1}} ,
               false ,
               true);

https://stackoverflow.com/questions/10522347/

相关文章:

arrays - 如何在 mongodb 中更新多个数组元素

database - 如何使用mongoimport导入csv

mongodb - 如何监听 MongoDB 集合的变化?

node.js - E11000 mongodb mongoose 中的重复键错误索引

mongodb - 根据日期返回查询

mongodb - 无法创建/打开锁定文件 :/data/mongod. lock errno:13

javascript - 如何在mongodb中的对象数组中搜索

mongodb - 如何查询嵌套对象?

mongodb - 对于小型 .NET 应用程序,什么是好的数据库选择?

mongodb - 如何为 MongoDB 集合中的所有文档选择单个字段?