【问题标题】:How To Use MongoDB Aggregate如何使用 MongoDB 聚合
【发布时间】:2016-02-17 19:22:50
【问题描述】:

我有以下数据对象:

[
  {
    "_id": "56bab”,
    "region": “AS”,
    “spentOn”: [
      “56bf623a0c90b5”
    ]
  },
  {
    "_id": "57bab",
    "region": "EU",
    "spentOn": [
      "b5”,
      "b6”,
      "b8”,
    ]
  },
  {
    "_id": "58bab",
    "region": "EU",
    "spentOn": [
      "b5”
      "b6”
    ]
  }
]

我想编写一个 MongoDB 调用(来自 JS),以根据我指定的区域获取最常见的 spentOn 值。 例如,如果我说 region='EU' 我希望返回:b6、b5 和 b8。

我已阅读 this page 并尝试了以下内容,但不确定如何获得特定地区的内容?

return Q.promise(function(resolve, reject) {
   User.aggregate( [
        { $group: { _id: "$spentOn", count: { "$sum":1 } } },
        { }
    ] );
    resolve();
});

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 我认为您在这里可能有点歪曲上下文。而不是“对象”,你不是说这些都是你User“集合”中的“对象”吗?另外,您认为{} 作为第二个流水线阶段的目的是什么? + 大提示是阅读文档。即$unwind。阅读核心文档中的所有Aggregation Examples 即可涵盖所有这些内容。
  • 哦,还有。现代 MongoDB 节点驱动程序实现(当前版本)以及 "mongoose"(您“看起来”一目了然地使用)都原生支持 Promises。所以不需要包装一个 Promise。关于这些事情,您“在网上阅读”的大多数内容通常都已过时。阅读驱动程序和库文档而不是博客文章。
  • @BlakesSeven 感谢您提供的信息。现在将阅读放松。关于我必须使用的承诺,因为我在这个例子中没有展示几个步骤,所以我在代码的后期使用 Q.all()。我尝试使用本机承诺(一旦找到结果就使用then,但没有奏效)。

标签: javascript mongodb


【解决方案1】:

就像 cmets 中已经建议的那样,这里的技巧是使用 $unwind 阶段。

因此,可能的解决方案是:

db.users.aggregate([
    {$match:{
        region: "EU"    
    }},
    {$unwind:"$spentOn"},
    {$group:{
        _id: "$spentOn",
        count: {$sum:1}
    }},
    {$sort: {count:-1}}
])

结果如下:

{ "_id" : "b6", "count" : 2 }
{ "_id" : "b5", "count" : 2 }
{ "_id" : "b8", "count" : 1 }

【讨论】:

  • 就是这样 - 我错过了比赛并放松了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多