首页 > 解决方案 > 如何将数据推送到数组mongodb

问题描述

使用三个集合查找重新管理数据。我很困惑该使用哪个。请对此进行指导

db.post.aggregate([
  {
    $lookup: {
      from: "users",
      localField: "created_by",
      foreignField: "_id",
      as: "created_users"
    }
  },
  {
    $lookup: {
      from: "comments",
      let: {
        p_id: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$post_id",
                "$$p_id"
              ]
            }
          }
        }
      ],
      as: "comments"
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "comments.sender_id",
      foreignField: "_id",
      as: "commented_user"
    }
  }
])

有三个收藏帖子,用户和评论我们想得到谁对帖子有评论,评论的用户应该在这样的评论下

[
  {
    "_id": ObjectId("5eeb02881982961ada625c7d"),
    "commented_user": [
      {
        "_id": ObjectId("5e4d0973babf2b74ca868f4d"),
        "first_name": "James",
        "last_name": "Smith",
        "timestamp": 1.582106995137e+12
      },
      {
        "_id": ObjectId("5e4d0973babf2b74ca868f6d"),
        "first_name": "Alex",
        "last_name": "Jimy",
        "timestamp": 1.582106995139e+12
      }
    ],
    "comments": [
      {
        "_id": ObjectId("5eeb08e26fb7f270e4077617"),
        "date": 1.592461538924e+12,
        "post_id": ObjectId("5eeb02881982961ada625c7d"),
        "sender_id": ObjectId("5e4d0973babf2b74ca868f4d"),
        "text": "Nice ",
        "commented_user": {
            "_id": ObjectId("5e4d0973babf2b74ca868f4d"),
            "first_name": "James",
            "last_name": "Smith",
            "timestamp": 1.582106995137e+12
        },
      },
      {
        "_id": ObjectId("5eeb08e26fb7f270e4077618"),
        "date": 1.592461538923e+12,
        "post_id": ObjectId("5eeb02881982961ada625c7d"),
        "sender_id": ObjectId("5e4d0973babf2b74ca868f6d"),
        "text": "Nice One",
        "commented_user": {
            "_id": ObjectId("5e4d0973babf2b74ca868f6d"),
            "first_name": "Alex",
            "last_name": "Jimy",
            "timestamp": 1.582106995137e+12
        },
      }
    ],
    "created_by": ObjectId("5e4e74eb380054797d9db623"),
    "created_users": [],
    "date": 1.589441206774e+12,
    "title": "Covid19"
  }
]

这是我的尝试https://mongoplayground.net/p/UwRjj-er0K5

请帮助解决这个问题谢谢

标签: mongodbaggregation-framework

解决方案


你可以这样做:

策略是$unwind获取结果,因此我们可以匹配每个评论,然后重建以前的结构。

db.post.aggregate([
 {
   $lookup: {
     from: "users",
     localField: "created_by",
     foreignField: "_id",
     as: "created_users"
   }
 },
 {
   $lookup: {
     from: "comments",
     let: {
       p_id: "$_id"
     },
     pipeline: [
       {
         $match: {
           $expr: {
             $eq: [
               "$post_id",
               "$$p_id"
             ]
           }
         }
       }
     ],
     as: "comments"
   }
 },
 {
   $unwind: "$comments"
 },
 {
   $lookup: {
     from: "users",
     localField: "comments.sender_id",
     foreignField: "_id",
     as: "commented_user"
   }
 },
 {
   $unwind: "$commented_user"
 },
 {
   $addFields: {
     comments: {
       $mergeObjects: [
         "$comments",
         {
           commented_user: "$commented_user"
         }
       ]
     }
   }
 },
 {
   $group: {
     _id: "$_id",
     comments: {
       $push: "$comments"
     },
     created_by: {
       $first: "$created_by"
     },
     created_users: {
       $first: "$created_users"
     },
     date: {
       $first: "$date"
     },
     title: {
       $first: "$title"
     },

   }
 }
])

蒙戈游乐场


推荐阅读