当我使用 $lookup
时,第二个 pipeline
有问题,但使用 localField
和 foreignField
时效果很好。
我的收藏如下:
FeedCategories:
{"_id":{"$oid":"1"},"name":"XXX1","status":"active"}
{"_id":{"$oid":"2"},"name":"XXX2","status":"active"}
Feeds:
{ "_id": { "$oid": "1" }, "category": { "$oid": "1" }, "status": "published" }
{ "_id": { "$oid": "2" }, "category": { "$oid": "1" }, "status": "published" }
{ "_id": { "$oid": "3" }, "category": { "$oid": "2" }, "status": "published" }
FeedCategoriesUser
{ "_id": { "$oid": "1" }, "Feed_left_id": { "$oid": "1" }, "User_right_id": { "$oid": "2" }}
{ "_id": { "$oid": "2" }, "Feed_left_id": { "$oid": "2" }, "User_right_id": { "$oid": "2" }}
我的猫鼬代码:
FeedCategoriesModel.aggregate([{
$lookup: {
from: 'feeds',
let: { categoryId: "$_id" },
pipeline: [
{ "$match": {
"$expr": { "$eq": [ "$category", "$$categoryId" ] },
"status": "published"
}}
],
as: 'feedsByCategory'
}
}, {
$lookup: {
from: 'feed_categories_user',
localField: 'feedsByCategory._id',
foreignField: 'Feed_left_id',
as: 'feedsByCategoryCompleted'
}
}]);
但是当我以这种方式使用管道时,我在 feedsByCategoryCompleted
中没有任何结果:
FeedCategoriesModel.aggregate([{
$lookup: {
from: 'feeds',
let: { categoryId: "$_id" },
pipeline: [
{ "$match": {
"$expr": { "$eq": [ "$category", "$$categoryId" ] },
"status": "published"
}}
],
as: 'feedsByCategory'
}
}, {
$lookup: {
from: 'feed_categories_user',
let: {feedid: "$feedsByCategory._id"},
pipeline:[{
"$match":{
"$expr": { "$eq": [ "$Feed_left_id", "$$feedid" ] }
}
}],
as: 'feedsByCategoryUsed'
}
}])
如何在上面的例子中使用 piepeline 进行第二次 $lookup?
答案 0 :(得分:1)
在第二次查找中,您需要在 $in
内使用 $eq
插入 $match
。原因是,feedsByCategory
是第一次查找的数组,您将其 _id
分配给 feedid
。所以它也是一个数组。当您检查数组内匹配项内的可能值时,您需要使用 $in
{
$lookup: {
from: "FeedCategoriesUser",
let: {
feedid: "$feedsByCategory._id"
},
pipeline: [
{
"$match": {
"$expr": {
"$in": [
"$Feed_left_id",
"$$feedid"
]
}
}
}
],
as: "feedsByCategoryUsed"
}
}