当前位置: 首页 > 知识库问答 >
问题:

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

荣德厚
2023-03-14

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

{
    "_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
            }
    ]
}

>

  • 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。

    db.test_invoice.update({user_id : 123456 , "items.item_name":"my_item_one"} , {$inc: {"items.$.price": 10}})
    
  • 共有1个答案

    秦光启
    2023-03-14

    对于问题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);
    
     类似资料:
    • 将mongodb与pymongo一起使用,我有以下文档: 我想更新示例子文档(这是一个数组元素,因为可能有多个示例)。我有以下代码,但它不工作... 谁能告诉我这个有什么问题吗?

    • 我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。

    • 我有一个模型看起来是这样的: 我正在使用存储库模式,下面是我的代码片段: 这实际上会引发以下错误: 我目前的做法 当前对我有效的是在更新嵌套对象时使用。然而,这提出了几点考虑: 需要额外的代码来获取整个文档、解析和更新必需的字段 由于在文档级别上工作,因此它还将更新文档中未更改的部分,这并不理想。

    • 我需要更新Mongo DB中另一个文档内的数组中的一个文档

    • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

    • 本文向大家介绍MongoDB查询中如何更新嵌套文档,包括了MongoDB查询中如何更新嵌套文档的使用技巧和注意事项,需要的朋友参考一下 要更新嵌套文档,请使用update(),并在其中使用点号。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是更新嵌套文档的查询- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-