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