经过许多次尝试后,我无法对集合进行良好的条件聚合。

我使用两个集合:

有很多评论的种族。

我只需要为第二条管道获得发表的评论。
我不想使用$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"},
   }
}

09-25 17:17