Агрегация MongoDB для нескольких коллекций и сопоставление всплывающих окон - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно создать агрегацию, которая запускается на нескольких коллекциях и может всплывать, искать. У меня 3 коллекции: Переделки:

{
    "_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"),
}

Заказы:

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

==========================

Условие ввода: Order_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"),
}

1 Ответ

1 голос
/ 24 октября 2019

Для 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"
    }
}
...