我如何在mongodb中设置自我加入

苏尼尔·杜比(Sunil Dubey)
db={
  comments: [
    {
      "_id": ObjectId("5f364189f412c01fd01abab3"),
      "content": "Comment 1",
      "parent_comment_id": "",
      "date": 1592461538923
    },
    {
      "_id": ObjectId("5f364642f412c01fd01abeu4"),
      "content": "Replied",
      "parent_comment_id": "5f364189f412c01fd01abab3",
      "date": 1592461538926
    },
    {
      "_id": ObjectId("5f364642f412c01fd01abtx5"),
      "content": "fresh comment",
      "parent_comment_id": "",
      "date": 1592461538929
    }
  ]
}

如何在基于parent_comment_id的mongodb中实现自我连接。

在mongodb中是否有可能像mysql一样?

土生的

使用聚合gregation()

  • $ addFields用于转换parent_comment_id为对象(如果不为空),如果它已经是对象ID,则跳过此管道
db.comments.aggregate([
  {
    $addFields: {
      parent_comment_id: {
        $cond: {
          if: { $eq: ["$parent_comment_id", ""] },
          then: "$parent_comment_id",
          else: { $toObjectId: "$parent_comment_id" }
        }
      }
    }
  },
  • $ lookup加入自我收集,并在管道中使用lookup以匹配条件
  • $ match parent_comment_id_id
  {
    "$lookup": {
      from: "comments",
      le": { pid: "$parent_comment_id" },
      as: "parentComment",
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$$pid", "$_id" ] }
          }
        }
      ]
    }
  },
  • $ unwind解构,parentComment因为它是一个数组,我们需要一个对象
  • preserveNullAndEmptyArrays忽略空parentComment数组
  {
    $unwind: {
      path: "$parentComment",
      preserveNullAndEmptyArrays: true
    }
  }
])

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章