【问题标题】:Update in embedded document(Nested collection)嵌入文档中的更新(嵌套集合)
【发布时间】:2015-08-22 02:24:57
【问题描述】:

我有一个集合,比如用户有列表用户,并且该用户有用户列表。像等级制度。

   {        
     "_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 个文档。我需要找到“数字”为 0 的集合。即使任何一个嵌入文档的“数字”为 0,我也想要该文档。

注意:我无法确定一个用户会有多少孩子。

【问题讨论】:

  • 我认为您需要进行一些编辑。你不需要找到“收藏”,对吗?你需要找到文件。此外:您是否需要像您的标题所暗示的那样找到它们或更新它们?
  • 对不起,如果我知道查找查询,我可以自己创建更新查询。所以我要求查找查询。
  • 这个模式似乎被设计成令人费解:) 然而,嵌套数组中的元素数量不会成为问题,但如果你不能告诉嵌入的最大级别,它会变得非常困难并且您拥有的键(这里的“1”,“2”不是索引,它们是键以及“名称”和“角色”)

标签: javascript mongodb


【解决方案1】:

好吧,我假设你的每个用户文档可以有两个子用户数组(即“1”和“2”),并且你有一个最大嵌套级别,比如 3(这意味着一个嵌套用户不能拥有超过 2 个锚点)。顺便说一句,the maximum nesting level allowed by mongodb is 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 查询。

【讨论】:

  • 谢谢您,我已经按照您所说的方式进行了。有没有通用的方法可以找到,否则我必须更改我的架构设计。
  • 答案是否定的,不知道键名,不知道嵌套层级的时候是找不到的。我真的建议改变 scema 设计
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2021-11-04
  • 2023-04-03
  • 2016-08-04
相关资源
最近更新 更多