所以我得到了以下数据:

用户集合

{
  _id: ObjectId("62a2a0422ec90fea68390aaa"),
  name: 'Robert Yamashita',
  username: 'robyama',
  email: 'robert.yamashita@rocketmail.com',
},
{
  _id: ObjectId("62a2a0452ec90fea68390aad"),
  name: 'Charles X',
  username: 'cvx',
  email: 'charles.xxx@rocketmail.com',
}

点数集合

{
  userId: ObjectId("62a2a0422ec90fea68390aaa"),
  action: 'Liked a post',
  points: 10,
}
{
  userId: ObjectId("62a2a0422ec90fea68390aaa"),
  action: 'Liked a post',
  points: 10,
}
{
  userId: ObjectId("62a2a0452ec90fea68390aad"),
  action: 'Liked a comment',
  points: 5,
}

我使用以下查询创建了一个管道来获取用户名robyama的总分:

db.users.aggregate([
  { $match: { username: 'robyama' } },
  {
    $lookup: {
      from: 'points',
      localField: '_id',
      foreignField: 'user',
      as: 'userPoints'
    }
  },
  {
    $unwind: '$userPoints'
  },
  {
    $group: {
      _id: {
        name: '$name',
        email: '$email',
        username: '$username',
      },
      count: { $sum: '$userPoints.points' }
    }
  }
]);

我得到了以下结果:

{
  "_id": {
    "name": "Robert Yamashita",
    "email": "robert.yamashita@rocketmail.com",
    "username": "robyama",
  },
  "count": 20
}

这正是我需要的,但我想在返回的查询中添加一个排名字段,因为Robert有20分,而Charles只有5分.所以理想情况下,我希望结果是这样的:

{
  "_id": {
    "name": "Robert Yamashita",
    "email": "robert.yamashita@rocketmail.com",
    "username": "robyama",
  },
  "count": 20
  "rank": 1
}

我应该在我的管道中添加什么才能获得上述输出?如有任何帮助,将不胜感激!

推荐答案

嗯,这是一种方法.

  1. 使用$lookup执行联接并计算每个用户的计数.

  2. 按计数按降序对元素进行排序.

  3. 将文档按_id作为空进行分组,并将它们全部推送到一个数组中.

  4. 展开数组,并获得行号.

  5. 找到您需要的文档,并使用行号计算排名.

    db.users.aggregate([
    {
    $lookup: {
      from: "points",
      localField: "_id",
      foreignField: "userId",
      as: "userPoints"
    }
    },
    {
    $unwind: "$userPoints"
    },
    {
    $group: {
      _id: {
        name: "$name",
        email: "$email",
        username: "$username",
    
      },
      count: {
        $sum: "$userPoints.points"
      }
    }
    },
    {
    "$sort": {
      count: -1
    }
    },
    {
    "$group": {
      "_id": null,
      "docs": {
        "$push": "$$ROOT",
    
      }
    }
    },
    {
    "$unwind": {
      path: "$docs",
      includeArrayIndex: "rownum"
    }
    },
    {
    "$match": {
      "docs._id.username": "robyama"
    }
    },
    {
    "$addFields": {
      "docs.rank": {
        "$add": [
          "$rownum",
          1
        ]
      }
    }
    },
    {
    "$replaceRoot": {
      "newRoot": "$docs"
    }
    }
    ])
    

这是link号操场.

Mongodb相关问答推荐

如何拉平mongo DB中的对象并在根目录中保存时有条件地重命名字段?

如何在MongoSH中的现有文档中插入字段

MongoDB 根据最新日期查询多个不同的值

从 Amazon S3(Next.js、Mongodb、Mongoose)删除图像

如何使用 MindsDB 和 MQL(对于我的 MongoDB 实例)实施零样本分类?

如何在mongoDB中按嵌套文档分组( group by )

从嵌套数组中 id 匹配的另一个集合中获取所有字段

有谁知道这个错误的修复方法(TypeError: Cannot assign to read only property ‘map’ of object '#')

在亚马逊 EC2 上托管 nodeJS/mongoose Web 应用程序

Pymongo API TypeError: Unhashable dict

findOneAndUpdate 和 findOneAndReplace 有什么区别?

如何在 mongodb 本机驱动程序中对 find() 进行字段 Select ?

spring-data-mongo - 可选查询参数?

如何在 MongoDB 聚合查询中使用 $hint?

mongodb启动错误

Mongoose.pre('save') 不会触发

Mongo按实际上是数字的字符串值排序

MongoDb 连接被拒绝

如何在 Mongoid 中引用嵌入的文档?

Pymongo/bson:将 python.cursor.Cursor 对象转换为可序列化/JSON 对象