繁体   English   中英

如何在 MongoDB 上高效查询复杂的层次结构

[英]How to efficiently query complex hierarchy on MongoDB

假设您有两个集合:CollectionA 和 CollectionB。

在 CollectionA 中,您有一个像这样的文档模型

_id
childs{
   kind
   position
   childA
   childB
}

childA是对 CollectionA 中文档的引用, childB是对 CollectionB 中文档的引用

在 CollectionB 中,您有一个像这样的文档模型

_id
propertyA
propertyB

我在 Node.Js 中所做的是一个递归函数,就像这个伪代码

function getProperties(id){
    let properties = [];
    if(id) {
        let document = collectionB.findOne(id);
        if(document && document.childs) {
            for(let child of document.childs) {
                if(child.childB){
                    properties = properties.concat(getProperties(child.childB)):
                }
                if(child.childA){
                    let documentA = collectionA.findOne(child.childA);
                    if(documentA){
                        properties.push(documentA.prpertyA);
                    }
                }
            }
        }
    }
    return properties;
}

然而,随着孩子的成长,从层次结构中获取所有属性的时间也会增加,有时会导致一分钟的等待时间(在某些情况下甚至超时!)。 那么,我该如何改进这一点,也许使用一些 mongodb 本机功能? 我已经在findOne函数中使用了 DataLoader,这有帮助,但没有我想象的那么多。

您可以使用聚合以简单的方式创建复杂的查询。

对于您的示例,您有两个集合:集合 A集合 B

您的基础集合是 B,因此我们可以从集合 B 创建一个聚合管道

db.collectionB.aggregate([
{
    $match: { _id: id } //
},
{
    $lookup:
    {
        from: 'collectionB',
        localField: '_id',
        foreignField: 'childB',
        as: 'childBobj'
    }
}
{
    $lookup:
    {
        from: 'collectionA',
        localField: '_id',
        foreignField: 'childA',
        as: 'childAobj'
    }
}
])

查询未完全满足您的目标,请进行相应更改。

我强烈建议您查看db.collection.aggregate

甚至您可以使用索引来缩短此查询的执行时间。

快乐编码!。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM