猫鼬加入两个集合并在两个属性中获取引用数据

玛丽

我正在做一个简单的关注好友功能。

请在下面查看我的代码:

以下架构:

{
 "userId": { type: String },
 "followers": [{ "followerId": type: String }],
 "followings": [{ "followingId": type: String }], 
}

用户架构:

{
 "fullName": { type: String } 
}

注意:用户8具有1个关注者和2个关注。

现在,我的预期输出应该是这样的:

        "userId": 8,
        "followers": [
            {
                "followerId": 4,
                "fullName": "Rose Marriott",
            },
            {
                "followerId": 5,
                "fullName": "James Naismith",
            }
        ],
        "followings": [
            {
                "followingId": 1,
                "fullName": "Russell Oakham",
            },
            {
                "followingId": 5,
                "fullName": "James Naismith",
            }
        ]

这是我到目前为止尝试过的:

 db.followings.aggregate([
 { $unwind: "$followers" },
    {
        $lookup: {
            from: "users",
            localField: "followers.followerId",
            foreignField: "_id",
            as: "users"
        }
    },
    { 
        $addFields: 
        { 
            users: { $arrayElemAt: ["$users", 0] },
        },
    },
    { $unwind: "$followings" },
    {
        $lookup: {
          from: "users",
          localField: "followings.followingId",
          foreignField: "_id",
          as: "users2"
        }
    },
    { 
        $addFields: 
        { 
            users2: { $arrayElemAt: ["$users2", 0] },
        },
    },
    { $match: {"userId": mongoose.Types.ObjectId(userId) } },
    {
        $group: {
            _id: "$_id",
            userId: { $first: "$userId" },
            followers: {
                $push: {
                    followerId: "$followers.followerId",
                    fullName: "$users.fullName",
                }
            },
            followings: {
                $push: {
                    followingId: "$followings.followingId",
                    fullName: "$users2.fullName",
                }
            }
        }
      }
  ]);

但是我有2个关注者和2个关注者。我想知道是什么导致了这个问题。感谢任何帮助。谢谢!

土生的

你可以试试,

  • $addFields制作一个称为userIdsform的唯一数组arrayfollowersfollowings$setUnion以获得唯一的ID,
  • $lookup 与用户集合
  • $project 显示字段,
    • followers获取fullName,$ map以迭代循环followersfollowerId使用$reduce从用户数组中获取名称$cond
    • followings获取fullName,$ map以迭代循环followingsfollowingId使用$reduce从用户数组中获取名称$cond
db.followings.aggregate([
  {
    $addFields: {
      userIds: {
        $setUnion: [
          {
            $map: {
              input: "$followers",
              in: "$$this.followerId"
            }
          },
          {
            $map: {
              input: "$followings",
              in: "$$this.followingId"
            }
          }
        ]
      }
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "userIds",
      foreignField: "_id",
      as: "users"
    }
  },
  {
    $project: {
      userId: 1,
      followers: {
        $map: {
          input: "$followers",
          as: "f",
          in: {
            $mergeObjects: [
              "$$f",
              {
                fullName: {
                  $reduce: {
                    input: "$users",
                    initialValue: "",
                    in: {
                      $cond: [
                        { $eq: ["$$this._id", "$$f.followerId"] },
                        "$$this.fullName",
                        "$$value"
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      },
      followings: {
        $map: {
          input: "$followings",
          as: "f",
          in: {
            $mergeObjects: [
              "$$f",
              {
                fullName: {
                  $reduce: {
                    input: "$users",
                    initialValue: "",
                    in: {
                      $cond: [
                        { $eq: ["$$this._id", "$$f.followingId"] },
                        "$$this.fullName",
                        "$$value"
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

操场

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

猫鼬加入两个集合并在两个属性中获取引用数据

来自分类Dev

猫鼬加入两个集合,并且仅从加入的集合中获取特定字段

来自分类Dev

映射并从猫鼬的两个集合中获取数据

来自分类Dev

汇总两个集合并在pymongo中的第一个集合中更新文档

来自分类Dev

在猫鼬中合并两个对象

来自分类Dev

从猫鼬的两个AND查询中获取结果

来自分类Dev

从猫鼬的两个AND查询中获取结果

来自分类Dev

如何在猫鼬中加入两个收藏

来自分类Dev

使用外部合并在Python中合并两个熊猫数据帧,无法识别相同的值

来自分类Dev

将两个ng-repeats合并在一个表中

来自分类Dev

加入两个集合

来自分类Dev

Node JS-猫鼬-如何通过ID将两个集合的结果正确合并

来自分类Dev

根据R中的列值将两个以上的数据帧合并在一起

来自分类Dev

猫鼬在一个字段中处理两个ref ObjectID以获取ObjectId的每个集合

来自分类Dev

将两个捕获子句合并在同一块中

来自分类Dev

猫鼬将其他集合添加到两个聚合集合中

来自分类Dev

在MongoDB中合并两个集合

来自分类Dev

猫鼬最佳查询-对两个属性进行排序

来自分类Dev

合并在JavaScript中合并两个数组

来自分类Dev

在Django中,| 当我将两个查询集合并在一起时,运算符正在创建重复项

来自分类Dev

过滤猫鼬中两个种群的空值

来自分类Dev

猫鼬中两个.save()的正确方法

来自分类Dev

合并数据并在两个表之间加入某些列

来自分类Dev

合并数据并在两个表之间加入某些列

来自分类Dev

在索引上将两个熊猫数据帧合并在一起时出错

来自分类Dev

您如何在Java中读取两个文件并将它们合并在一起?

来自分类Dev

加入/合并两个熊猫数据框并填充

来自分类Dev

如何将两个嵌套词典合并在一起?

来自分类Dev

如何合并在C ++中共享相同基类的两个类?

Related 相关文章

  1. 1

    猫鼬加入两个集合并在两个属性中获取引用数据

  2. 2

    猫鼬加入两个集合,并且仅从加入的集合中获取特定字段

  3. 3

    映射并从猫鼬的两个集合中获取数据

  4. 4

    汇总两个集合并在pymongo中的第一个集合中更新文档

  5. 5

    在猫鼬中合并两个对象

  6. 6

    从猫鼬的两个AND查询中获取结果

  7. 7

    从猫鼬的两个AND查询中获取结果

  8. 8

    如何在猫鼬中加入两个收藏

  9. 9

    使用外部合并在Python中合并两个熊猫数据帧,无法识别相同的值

  10. 10

    将两个ng-repeats合并在一个表中

  11. 11

    加入两个集合

  12. 12

    Node JS-猫鼬-如何通过ID将两个集合的结果正确合并

  13. 13

    根据R中的列值将两个以上的数据帧合并在一起

  14. 14

    猫鼬在一个字段中处理两个ref ObjectID以获取ObjectId的每个集合

  15. 15

    将两个捕获子句合并在同一块中

  16. 16

    猫鼬将其他集合添加到两个聚合集合中

  17. 17

    在MongoDB中合并两个集合

  18. 18

    猫鼬最佳查询-对两个属性进行排序

  19. 19

    合并在JavaScript中合并两个数组

  20. 20

    在Django中,| 当我将两个查询集合并在一起时,运算符正在创建重复项

  21. 21

    过滤猫鼬中两个种群的空值

  22. 22

    猫鼬中两个.save()的正确方法

  23. 23

    合并数据并在两个表之间加入某些列

  24. 24

    合并数据并在两个表之间加入某些列

  25. 25

    在索引上将两个熊猫数据帧合并在一起时出错

  26. 26

    您如何在Java中读取两个文件并将它们合并在一起?

  27. 27

    加入/合并两个熊猫数据框并填充

  28. 28

    如何将两个嵌套词典合并在一起?

  29. 29

    如何合并在C ++中共享相同基类的两个类?

热门标签

归档