代码之家  ›  专栏  ›  技术社区  ›  websanya

MongoDB中对象数组内的多个对象数组

  •  1
  • websanya  · 技术社区  · 7 年前

    其他程序员。 使用这样的MongoDb模型是否被认为是一种不好的做法:

    {
        companyId: '',
        companyName: '',
        companyDivisions: [
            {
                divisionId: '',
                divisionName: '',
                divisionDepartments: [
                    {
                        departmentId: '',
                        departmentName: ''
                    },
                    ...
                ]
            },
            ...
        ],
    },
    ...
    

    因为现在更新某些部门变得越来越复杂。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   Marcello    7 年前

    我不认为这是一种不好的做法 一般来说 . 如果您的模型类似于此数据结构,那么利用文档数据库以这种方式存储数据是一个不错的选择。您可以自然地处理数据,并且很可能直接映射到数据模型上。

    另一种选择是拥有三种不同的收藏:

    • 公司;
    • 部门;
    • 部门。

    然而,在这种情况下,最终将像在关系数据库中一样存储数据。因此,这不仅仅是一般规则,而是数据库上的数据模型和预期查询概要文件的问题。

    编辑:使用MongoDb 3.6+

    使用面向文档的方法,可以使用以下更新对单个部门进行粒度更新:

    db.companies.findAndModify(
    {
        query: {
            "companyId": "yourCompanyId"
        },
        update: {
            $set : { "companyDivisions.$[element1].divisionDepartments.$[element2].divisioneName": "yourNewName" }
        },
        arrayFilters: [ 
            { "element1.divisionId": "yourDivisioneId" },
            { "element2.departmentId": "yourDepartementId" } 
        ]
    });
    

    此更新使用新的强大 filtered positional operator feature MongoDB v3.6引入。这个 $[<identifier>] 语法允许根据中表示的特定条件选择数组项 arrayFilters 的选项 db.collection.findAndModify() 方法

    请注意,如果条件匹配多个数组项,则更新会影响所有这些项,因此也允许进行多个更新。

    此外,请注意,我只会在需要时应用这样的优化,因为 过早优化是万恶之源。(D.克努特) .