嗨,我们如何保留先前聚合管道中的值。假设我有多个集合,在这种情况下假设有3个集合。每个集合中可能有超过1000个文档
///collection 1: collection1///
{
"_id" : ObjectId("5e58b69b76e00159b4dfd286"),
"name" : "Dean"
"type" : ["app"],
"city" : "cityA1",
}
///collection 2: collection2///
{
"_id" : ObjectId("5e1efac668c3c811c83263cc"),
"code" : "A001",
"day" : "sunday",
"city" : "cityA1",
"status":"active"
},
{
"_id" : ObjectId("5e1efac668c3c811c83265fb"),
"Code" : "A002",
"day" : "sunday",
"city" : "cityA1",
},
///collection 3: collection3///
{
"_id" : ObjectId("5e58b69b76e00159b4dfd286"),
"collection1_Id":ObjectId("5e58b69b76e00159b4dfd286")
"handleCount" : 34,
"code" : "A001",
},
{
"_id" : ObjectId("5e58b69b76e00159b4dfd286"),
"collection1_Id":ObjectId("5e58b69b76e00159b4dff345")
"code" : "A001",
}
现在是查询
db.collection1.aggregate([
{
'$match': {
status: 'active',
}
},
{
$lookup: {
from: "collection2",
let: {
city: "$city",
},
pipeline: [
{
$match: {
$expr: {
$eq: ["$city", "$$city"]
}
}
}
], as: "collection2"
}
}, {'$unwind':'$collection2'},
{
$lookup: {
from: "collection3",
let: {
collection1_Id: "$_id",
},
pipeline: [
{
$match: {
$expr: {
$eq: ["$collection1_Id", "$$$collection1_Id"]
}
}
}
], as: "collection3"
}
},])
现在此查询给出collection1和collection2的结果,因为“ city”是公用密钥,但是collection1和collection3之间的公用密钥分别是“ _id”和“ collection1_Id”,我不能在第三个管道中使用第一个管道的the_id管道,如果我不能,那么此解决方法是什么。我正在尝试实现此问题说明。 1:,我需要找出所有活动ID的FOM集合1。 2:然后,我需要从collection2中找出该城市的所有“代码”。 3:然后,如果collection1_id与collection1“ _id”匹配,那么我需要从collection3中查找“ chainCount”。
答案 0 :(得分:0)
我想您正在寻找$facet阶段:
{ $facet:
{
output_collection2: [ {
$lookup: {
from: "collection2",
....
],
output_collection3: [ {
$lookup: {
from: "collection3",
...
],
}
}