【问题标题】:How to use aggregation to pull information from a nested array on objects in mongoDB如何使用聚合从 mongoDB 中对象的嵌套数组中提取信息
【发布时间】:2020-03-29 01:09:21
【问题描述】:

我正在尝试掌握 mongoDB 中聚合的窍门,我是新手,我想我有点迷路了。 我有一个用户集合,每个用户都有一个社交网络数组,这个数组中的每个项目都是一个对象。 如何仅从给定的社交网络对象中获取价值。

{
 "user":{
     "_id": "d10430c8-e59",
     "username": "John",
     "password": "f7wei93",
     "location": "UK",
     "gender": "Male",
     "age": 26,
     "socials": [
        {
            "type": "instagram",
            "maleFollowers": 23000,
            "femaleFollowers": 65000,
            "posts": 5400,
            "avgFollowerAge": 22
        },
        {
            "type": "facebook",
            "maleFollowers": 4000,
            "femaleFollowers": 6700,
            "posts": 330,
            "avgFollowerAge": 25
        },
        {
            "type": "snapchat",
            "maleFollowers": 873,
            "femaleFollowers": 1200,
            "posts": 1200,
            "avgFollowerAge": 21
        },

     ]
 }
}

我想获取总关注者计数(maleFollowers + femaleFollowers) 对于数组中给出的每种社交网络类型。 例如 ["instagram", "snapchat"] 只会给我这两个特定网络的 totalFollowersCount。

我开始玩聚合,但一直没有弄明白。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    首先,我们需要展平socials 数组。然后,我们按社交type + 'user' 字段和sum( maleFollowers + femaleFollowers) 分组。

    使用$match 运算符,我们过滤所需的社交网络。

    db.users.aggregate([
      {
        $unwind: "$user.socials"
      },
      {
        $group: {
          _id: {
            user: "$user._id",
            type: "$user.socials.type"
          },
          "totalFollowersCount": {
            $sum: {
              $add: [
                "$user.socials.femaleFollowers",
                "$user.socials.maleFollowers"
              ]
            }
          }
        }
      },
      {
        $match: {
          "_id.type": {
            $in: [
              "instagram",
              "snapchat"
            ]
          }
        }
      }
    ])
    

    MongoPlayground

    【讨论】:

    • 您好,非常感谢您的快速回复。我会试一试的。
    • 所以我试了一下。我的意思是将每个用户的 totalFollowersCount 分组,而不是将所有用户放在一起,这样我可以获得 5 个最受关注的用户或只有具有一定数量关注者的用户
    • @RotemCarmon 请再检查一遍
    猜你喜欢
    • 2018-09-10
    • 2021-08-13
    • 2021-07-20
    • 2021-07-18
    • 2022-01-22
    • 2020-04-23
    • 2020-01-24
    • 2018-03-06
    • 2015-03-10
    相关资源
    最近更新 更多