假设我有以下文档 struct ,其中保存了员工、他们各自的位置以及他们所在的公司:

{
    "name": "john",
    "city": "milan",
    "company": "apple"
},
{
    "name": "nicole",
    "city": "rome",
    "company": "microsoft"
}

我正在努力实现的目标,最好是在一个请求范围内,给我提供城市和公司的前n个组.我想要有他们工作的前n个城市和前n家公司.

例如:

[
    {
        "milan": 23,
        "rome": 21,
        "new york": 18,
        "berlin": 10
    },
    {
        "facebook": 10,
        "apple": 8,
        "amazon": 8,
        "google": 2
    }
]

我可以做的是使用$sum个简单的聚合管道,但这会扫描整个集合,不会给出排名靠前(最受欢迎的)结果.

推荐答案

you can use $facet in this case as mentioned in the comment by @user20042973
i used the k and v format so that I can use $arrayToObject on a later stage to convert it to an object

db.collection.aggregate([
  {
    $facet: {
      cities: [
        { $group: { _id: "$city", v: { $sum: 1 } } },
        { $sort: { v: -1 } },
        { $limit: n },
        { $project: { k: "$_id", v: "$v", _id: 0 } }
      ],
      companies: [
        { $group: { _id: "$company", v: { $sum: 1 } } },
        { $sort: { v: -1 } },
        { $limit: n },
        { $project: { k: "$_id", v: "$v", _id: 0 } }
      ]
    }
  },
  { $project: { converted: [ { $arrayToObject: "$cities" }, { $arrayToObject: "$companies" } ] } },
  { $unwind: "$converted" },
  { $replaceRoot: { newRoot: "$converted" } }
])

playground

Mongodb相关问答推荐

在MongoDB中,如何使用$in来匹配存储在数组变量中的值

在服务器上部署后端时判断??=默认判断

MongoDB 聚合 - 条件 $lookup 取决于字段是否存在

MongoDB 聚合 $match 阶段与条件查询

mongoDB文档数组字段中的唯一项如何

在运算符 $map 中嵌入运算符 $exists

MongoDB 将 JSON 字符串转换为数组[{obj1},{obj2}]的实际对象

Mongoose 和 MongoDB,如何在具有多个引用的两个模型之间创建关系?

更新 Mongodb 中的多嵌套数组

如何将 MongoDB 集合中的 _id 字段更改为 User_id?

在 MongoDB 中打开连接的 SocketTimeout

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

什么 Javascript 库可以针对对象判断类似 MongoDB 的查询谓词?

如何在 MongoDb 中使用杰克逊将日期字段存储为 ISODate()

在 Mongo 中存储嵌套类别的最有效方法?

NodeJS中的密码重置

启动mongodb和express的正确方法?

Node + Mongoose:获取最后插入的 ID?

无法在 mac os 10.9 上安装 mongodb php 驱动程序

对象不是 JSON 可序列化的