代码之家  ›  专栏  ›  技术社区  ›  A. L

mongodb-在$lookup管道中使用$match$进行聚合

  •  1
  • A. L  · 技术社区  · 6 年前

    如果我有以下对象 obj :

    {
        "abc1": "xyz1",
        "abc2": "xyz2",
        "abc3": "xyz3"
    }
    

    我想做一个聚合,比如:

    db.collection.aggregate([
        { 
            "$match": { 
                "_id": {
                    $in:
                        Object.keys(obj)
                }
            } 
        },
        {
            "$lookup": {
                "from": "subdocument",
                "pipeline": [
                    { 
                        "$match": { 
                            "_id": ObjectId(matching_value) 
                        } 
                    },
                ],
                "as": "subdocument"
            }
        },
        { "$unwind": "$subdocument" }
    ])
    

    我怎么得到 $lookup 要匹配对象键以匹配对象值的管道?有可能吗?

    所以这是一个单一的数据库调用版本:

    let obj = {
        "abc1": "xyz1",
        "abc2": "xyz2",
        "abc3": "xyz3"
    }
    
    for (let key in obj)
    {
        db.collection.aggregate([
            { 
                "$match": { 
                    "_id": 
                        ObjectId(key)
                } 
            },
            {
                "$lookup": {
                    "from": "subdocument",
                    "pipeline": [
                        { 
                            "$match": { 
                                "_id": ObjectId(obj[key]) 
                            } 
                        },
                    ],
                    "as": "subdocument"
                }
            },
            { "$unwind": "$subdocument" }
        ])
    }
    

    示例集合

    db.maindocuments
    [
        {
            _id: "abc1",
            data: "data"
        },
        {
            _id: "abc2",
            data: "data"
        },
        {
            _id: "abc3",
            data: "data"
        }
    ]
    


    db.subdocuments
    [
        {
            _id: "xyz1",
            data: "data"
        },
        {
            _id: "xyz2",
            data: "data"
        },
        {
            _id: "xyz3",
            data: "data"
        }
    ]
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ashh    6 年前

    好吧,我可以看出这两个收藏品之间没有任何关系。这就是为什么 $lookup 无法工作,因为文档中没有匹配的密钥。

    因此,您可以使用 async await

    const obj = {
      "abc1": "xyz1",
      "abc2": "xyz2",
      "abc3": "xyz3"
    }
    
    for (let key in obj) {
      const data = await db.collection.findOne({ _id: key })
      const subdocument = await db.subdocument.findOne({ _id: obj[key] })
      data.subdocument = subdocument
    }