Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个集合上的MongoDB聚合和popuplate匹配_Mongodb_Aggregation Framework - Fatal编程技术网

多个集合上的MongoDB聚合和popuplate匹配

多个集合上的MongoDB聚合和popuplate匹配,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我需要创建在多个集合上运行的聚合,并可以进行弹出式上传、搜索。我有3个系列: 返工: 修理: { "_id" : ObjectId("5d54f04dbe5e6275e53a551e"), "name" : "Repair_1", "kind" : 2, "order" : ObjectId("5d352477e340044098d5bb4e"), }, { "_id" : ObjectId("5d23f4ba0df6d8476c8384b2"),

我需要创建在多个集合上运行的聚合,并可以进行弹出式上传、搜索。我有3个系列: 返工:

修理:

{
    "_id" : ObjectId("5d54f04dbe5e6275e53a551e"),
    "name" : "Repair_1",
    "kind" : 2,
    "order" : ObjectId("5d352477e340044098d5bb4e"),
},
{
    "_id" : ObjectId("5d23f4ba0df6d8476c8384b2"),
    "name" : "Repair_2",
    "kind" : 2,
    "order" : ObjectId("5d649838c563ef36c17b62ed"),
}
订单:

{
    "_id" : ObjectId("5d649838c563ef36c17b62ed"),
    "name" : "Order_1_abc",
},
{
    "_id" : ObjectId("5d352477e340044098d5bb4e"),
    "name" : "Order_2_xyz"
}
==========================

条件输入:订单2

结果:

{
    "_id" : ObjectId("5da9586911e192081ee1c6be"),
    "name" : "Rework_2",
    "kind" : 1,
    "order" : {
        "_id" : ObjectId("5d352477e340044098d5bb4e"),
        "name" : "Order_2_xyz"
    }
},
{
    "_id" : ObjectId("5d54f04dbe5e6275e53a551e"),
    "name" : "Repair_1",
    "kind" : 2,
    "order" : {
        "_id" : ObjectId("5d352477e340044098d5bb4e"),
        "name" : "Order_2_xyz"
    }
}
但我刚刚包含了2个集合,但无法向订单集合添加条件:

db.getCollection('reworks').aggregate( [ 
  { "$limit": 1 },
  { "$project": { _id: "$$REMOVE" } },
  { "$lookup": { "from": "repairs", "pipeline": [], "as": "ref_repairs" } },
  { "$lookup": { "from": "reworks", "pipeline": [], "as": "ref_reworks" } },
  { "$project": { "union": { "$concatArrays": ["$ref_repairs", "$ref_reworks"] } } },
  { "$unwind": "$union" },
  { "$replaceRoot": { newRoot: "$union" } } 
  ]
)
===>
{
    "_id" : ObjectId("5d64d2bf48dd17387d77d27a"),
    "name" : "Rework_1",
    "kind" : 1,
    "order" : ObjectId("5d649838c563ef36c17b62ed"),
},
{
    "_id" : ObjectId("5da9586911e192081ee1c6be"),
    "name" : "Rework_2",
    "kind" : 1,
    "order" : ObjectId("5d352477e340044098d5bb4e"),
},
{
    "_id" : ObjectId("5d54f04dbe5e6275e53a551e"),
    "name" : "Repair_1",
    "kind" : 2,
    "order" : ObjectId("5d352477e340044098d5bb4e"),
},
{
    "_id" : ObjectId("5d23f4ba0df6d8476c8384b2"),
    "name" : "Repair_2",
    "kind" : 2,
    "order" : ObjectId("5d649838c563ef36c17b62ed"),
}
对于MongoDB 3.6版+

以下查询可以获得预期的输出:

db.orders.aggregate([
    {
        $match:{
            "name":"Order_2_xyz"
        }
    },
    {
        $project:{
            "root":"$$ROOT"
        }
    },
    {
        $lookup:{
            "from":"repairs",
            "let":{
                "orderId":"$_id"
            },
            "pipeline":[
                {
                    $match:{
                        $expr:{
                            $eq:["$order","$$orderId"]
                        }
                    }
                }
            ],
            "as":"repairsLookup"
        }
    },
    {
        $lookup:{
            "from":"reworks",
            "let":{
                "orderId":"$_id"
            },
            "pipeline":[
                {
                    $match:{
                        $expr:{
                            $eq:["$order","$$orderId"]
                        }
                    }
                }
            ],
            "as":"reworksLookup"
        }
    },
    {
        $addFields:{
            "repairsLookup.order":"$root",
            "reworksLookup.order":"$root"
        }
    },
    {
        $project:{
            "merged":{
                $concatArrays:[
                    "$repairsLookup",
                    "$reworksLookup"
                ]
            }
        }
    },
    {
        $unwind:"$merged"
    },
    {
        $replaceRoot:{
            "newRoot":"$merged"
        }
    }
]).pretty()
输出:

{
    "_id" : ObjectId("5d54f04dbe5e6275e53a551e"),
    "name" : "Repair_1",
    "kind" : 2,
    "order" : {
        "_id" : ObjectId("5d352477e340044098d5bb4e"),
        "name" : "Order_2_xyz"
    }
}
{
    "_id" : ObjectId("5da9586911e192081ee1c6be"),
    "name" : "Rework_2",
    "kind" : 1,
    "order" : {
        "_id" : ObjectId("5d352477e340044098d5bb4e"),
        "name" : "Order_2_xyz"
    }
}

我的MongoDB版本是4.0。没关系,非常感谢
{
    "_id" : ObjectId("5d54f04dbe5e6275e53a551e"),
    "name" : "Repair_1",
    "kind" : 2,
    "order" : {
        "_id" : ObjectId("5d352477e340044098d5bb4e"),
        "name" : "Order_2_xyz"
    }
}
{
    "_id" : ObjectId("5da9586911e192081ee1c6be"),
    "name" : "Rework_2",
    "kind" : 1,
    "order" : {
        "_id" : ObjectId("5d352477e340044098d5bb4e"),
        "name" : "Order_2_xyz"
    }
}