经过许多次尝试后,我无法对集合进行良好的条件聚合。
我使用两个集合:
有很多评论的种族。
我只需要为第二条管道获得发表的评论。
我不想使用$project
。
是否可以仅使用$match
?
当我使用localField,foreignField时,它可以完美工作,但是我只需要过滤已发布的评论。
我为此付出了很多努力,我不明白为什么let
没有给我ForeignKey。
我尝试了:_id
,$reviews
等。
我的$lookup
看起来像这样:
{
$lookup: {
from: "reviews",
as: "reviews",
let: { reviewsId: "$_id" },
pipeline: [
{
$match: {
$expr: {
$and: [
// If I comment the next line, it give all the reviews to all the races
{ $eq: ["$_id", "$$reviewsId"] },
{ $eq: ["$is_published", true] }
]
}
}
}
]
// localField: "reviews",
// foreignField: "_id"
}
},
比赛示例:
{
"description":"Nice race",
"attendees":[
],
"reviews":[
{
"$oid":"5c363ddcfdab6f1d822d7761"
},
{
"$oid":"5cbc835926fa61bd4349a02a"
}
],
...
}
审查示例:
{
"_id":"5c3630ac5d00d1dc26273dab",
"user_id":"5be89576a38d2b260bfc1bfe",
"user_pseudo":"gracias",
"is_published":true,
"likes":[],
"title":"Best race",
"__v":10,
...
}
我很快会发疯的:'(...
如何做到这一点?
最佳答案
您的问题是这一行:
{ $eq: ["$is_published", true] }
您正在使用此文档的
_id
字段来匹配评论之一。正确的版本如下所示:
(
[
{
"$unwind" : "$reviews"
},
{
"$lookup" : {
"from" : "reviews",
"as" : "reviews",
"let" : {
"reviewsId" : "$reviews"
},
"pipeline" : [
{
"$match" : {
"$expr" : {
"$and" : [
{
"$eq" : [
"$_id",
"$$reviewsId"
]
},
{ $eq: ["$is_published", true] }
]
}
}
}
]
}
}
],
);
现在,如果要还原旧结构,请添加:
{
$group: {
_id: "$_id",
reviews: {$push: "$reviews"},
}
}