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

MongoDB中对象数组中的多个对象数组,mongodb,nosql,Mongodb,Nosql,其他程序员。 使用这样的MongoDb模型是否被认为是一种不好的做法: { companyId: '', companyName: '', companyDivisions: [ { divisionId: '', divisionName: '', divisionDepartments: [ { departm

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

{
    companyId: '',
    companyName: '',
    companyDivisions: [
        {
            divisionId: '',
            divisionName: '',
            divisionDepartments: [
                {
                    departmentId: '',
                    departmentName: ''
                },
                ...
            ]
        },
        ...
    ],
},
...
因为现在更新某些部门变得越来越复杂


谢谢。

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

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

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

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

db.companies.findAndModify(
{
    query: {
        "companyId": "yourCompanyId"
    },
    update: {
        $set : { "companyDivisions.$[element1].divisionDepartments.$[element2].divisioneName": "yourNewName" }
    },
    arrayFilters: [ 
        { "element1.divisionId": "yourDivisioneId" },
        { "element2.departmentId": "yourDepartementId" } 
    ]
});
此更新使用了MongoDB v3.6引入的新的强大功能。
$[]
语法允许根据
db.collection.findAndModify()方法的
arrayFilters
选项中表示的特定条件选择数组项

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


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

在我的旧模式中(该数据库实际上是一个.dbf文件,转换为.json并导入到mongodb中),
部门ID
不是唯一的。因此,在每个部门中,都有一个部门的
departmentId
等于1。因此,在我的例子中,我需要设置多个条件(例如,如果
divisionId
等于528,则为
departmentId
等于2的部门设置一个新名称,或者将该部门完全拉出来)。我想我需要做的是从前端(Vue.js应用程序)发送一份完整的公司文档,并在数据库中进行更新。我说的对吗?在文档数据库中,检索整个文档以更新其中的一部分是正常的做法。您最终将数据库用作数据存储桶,并且代码仍然非常面向域。因此,它甚至可能被认为是可取的。至于性能问题,您可以使用相对较小的文档、数据集和普通硬件每秒执行数百甚至数千次这样的更新。如果您遇到数据库/网络瓶颈,那么您必须坚持更细粒度的更新策略,避免来回传输整个文档。我刚刚在回答中添加了代码,以便对部门执行细粒度更新。