更新嵌入文档(嵌套集合)

Update in embedded document(Nested collection)

本文关键字:嵌套 集合 文档 更新      更新时间:2023-09-26

我有一个像User这样的集合,它有一个list User,而这个User有一个list of User。像等级。

   {        
     "_id" : ObjectId("55530326bc687d21783fd1ff"),
            "Name" : "User 1",
            "Role" : "Manager",
        number:NumberLong(0),
            "1" : 
        [
        {
        "_id" : ObjectId("55530326bc687d21783fd1fd"),
            "Name" : "User 2",
            "Role" : "Ass Manager",
        number:NumberLong(0),
            "1" : 
        [
        .......
        ]
        }
        {
        "_id" : ObjectId("55530326bc687d21783fd1fq"),
            "Name" : "User 2",
            "Role" : "Ass Manager",
    number:NumberLong(1),
            "1" : 
        [
        .........
        ]
        },
        {
        "_id" : ObjectId("55530326bc687d21783fd1fg"),
            "Name" : "User 3",
            "Role" : "Ass Manager",
    number:NumberLong(2),
            "1" : 
        [
        ........
        ]
        }
        ],
         "2" : 
        [
        {
        "_id" : ObjectId("55530326bc687d21783fd1fw"),
            "Name" : "User 4",
            "Role" : "Specialist",
        number:NumberLong(0),
            "1" : 
        [
        .......
        ]
        }
        {
        "_id" : ObjectId("55530326bc687d21783fd1fe"),
            "Name" : "User 5",
            "Role" : "Specialist",
    number:NumberLong(1),
            "1" : 
        [
        .........
        ]
        },
        {
        "_id" : ObjectId("55530326bc687d21783fd1fr"),
            "Name" : "User 6",
            "Role" : "Specialist",
    number:NumberLong(2),
            "1" : 
        [
        ........
        ]
        }
        ]
        }

上面只是一个样本集合,像这样我有近10000个文档。我需要找到'number'为0的集合。即使任何一个嵌入的文档'number'为0,我也要那个文档。

注意:我不知道一个用户会有多少个子节点。

好吧,我将假设您的每个User文档都可以有两个子用户数组(即"1"answers"2"),并且您有一个最大嵌套级别,例如3(这意味着嵌套用户不能有超过2个锚定)。顺便说一下,mongodb允许的最大嵌套级别是100。

可能这不是你想要的:在这种情况下,你的模式设计有问题,因为

  • 任意嵌套的模式是不好的
  • 如果键被用作索引,你应该考虑使用数组而不是对象(点击这里了解类似情况)。

现在,让我们假装我的假设对你来说是正确的。试试(我叫你的集合users,因为我们通常不大写集合名称):

db.users.find({$or:["1.number" : 0, "2.number" : 0, "1.1.number":0, "1.2.number":0, ..., "2.2.1.number":0, "2.2.2.number":0]})

我跳过了一些需要添加的组合。请注意,您不需要担心数组中的位置,并且只有3层嵌套,$or操作符已经有相当多的子句,这可能会说服您更好地遵循链接的最佳实践。

对未来读者的注意:OP在评论中澄清了他实际上不需要update,而是find查询。