【问题标题】:Mongodb $lookup using with multiple criteria mongodbMongodb $lookup 使用多个条件 mongodb
【发布时间】:2020-09-07 20:02:13
【问题描述】:
{
    $lookup: {
      from: "Comment",
      let: {
        p_id: "$_id",
        d_id: "$data_id",

      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [
                    "$_id",
                    "$$p_id"
                  ]
                },
                {
                  $eq: [
                    "$data_id",
                    "$$d_id"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "subComment"
    }
  }

https://mongoplayground.net/p/GbEgnVn3JSv 我擅长 mongoplayground,但试图把我的想法放在那里

我想获取基于 doc_id 和 post_id 的帖子评论,用于 mainComment 查询看起来不错,但子命令不好。请指导一下

它很简单,因为一个帖子可以有多个评论,需要评论计数基于 Post.data._id 等于 Comment.doc_id 和 Post._id 在 Comment.post_id 中

【问题讨论】:

    标签: node.js mongodb aggregation-framework aggregate-functions


    【解决方案1】:

    不确定“mainComment”和“subComment”是什么,我相信你错过了前面的美元符号

      {
        $project: {
          _id: 1,
          main_comments_count: {
            $size: "$mainComment"
          },
          sub_comments_count: {
            $size: "$subComment"
          },
    
        }
      }
    

    更新

    你在操场上做错的是你在lookup.let阶段使用了$data。 $data 是一个文档,您实际要查找的字段是 $data._id。

    • 旁注:如果您只使用一个字段进行查找,您可以在查找阶段简单地使用localField 和foreign。那里不需要使用let 和pipeline。
    db.setting.aggregate([
      {
        $lookup: {
          from: "site",
          "let": {
            "pid": "$data._id"   //here
          },
          "pipeline": [
            {
              "$match": {
                "$expr": {
                  "$in": [
                    "$doc_id",
                    "$$pid"
                  ]
                }
              }
            }
          ],
          "as": "subComment"
        }
      },
      {
        $addFields: {
          countRecord: "$subComment"
        }
      }
    ])
    

    即这给出了相同的输出

    db.setting.aggregate([
      {
        $lookup: {
          from: "site",
          localField: "data._id",
          foreignField: "doc_id",
          as: "subComment"
        }
      },
      {
        $addFields: {
          countRecord: "$subComment"
        }
      }
    ])
    

    【讨论】:

    • 更新了操场上的代码,它应该返回我两个,而不是 0 见操场https://mongoplayground.net/p/GbEgnVn3JSv
    • @SunilDubey 首先,我认为您将不得不使用“arrayElemAt”从数组中获取第一个文档。其次,在“eq”中,您应该使用“$post_id”和“$doc_id”,如第二个集合中所示
    • 如果我想显示计数 "data": [ { "_id": ObjectId("5e7cd2019b1c522b15cca6fe"), "url": "xyz.jpg", "width": 1000, “高度”:1000,“计数”:2},{“_id”:ObjectId(“5e7cd2019b1c522b15cca6fd”),“url”:“verr.jpg”,“宽度”:601,“高度”:1000}]跨度>
    • 你可以看到这个匹配数据的_id 5e7cd2019b1c522b15cca6fe 所以它应该添加到这个数组中是可能的
    • 好的@chakwok,一旦你回到电脑,我也在尝试..
    猜你喜欢
    • 2020-08-02
    • 2019-06-20
    • 2020-05-11
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2016-10-08
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多