【问题标题】:Grouping by property value (and counting?) in MongoDB在 MongoDB 中按属性值(和计数?)分组
【发布时间】:2014-08-26 16:37:17
【问题描述】:

我正在将 Meteor 用于 Web 项目,我需要找到一种方法来通过其中一个属性对集合中的记录进行分组(和计数)。这是集合中的示例记录,我需要这样做:

{
    "owner" : "7YnNwSC3E3iTcRHcC",
    "isbn" : "1551110881",
    "title" : "Introduction",
    "type" : "0",
    "class" : "ADNR1234",
    "condition" : "0",
    "active" : false,
    "createdAt" : ISODate("2014-08-18T15:38:30.012Z"),
    "tradeFor" : {
        "isbn" : "7463849506",
        "title" : "Intro 2"
    },
    "_id" : "RFzvEdLkYxt5EmQ7s"
}

我知道我需要找到一种方法来做……我猜这叫做聚合?无论如何......我需要使用的属性是“类”。我需要一种方法来遍历整个集合,并让我输出每个类 (ADNR1234) 以及每个使用的类作为值的记录数。

我希望我没有问这个问题不好,我对 Meteor 有点陌生,这似乎是一个尝试解决的奇怪问题。

【问题讨论】:

  • 这些文档是否已经发布到客户端,或者您是否希望在服务器上进行聚合?

标签: meteor aggregation-framework


【解决方案1】:

【讨论】:

  • 你的意思是 Meteor 不支持 MongoDB 聚合,对吧?
  • @AsyaKamsky vanilla meteor 本身不会,但如果你在上面添加一个聚合包,你可以让它与 Meteor 一起使用
【解决方案2】:

Meteor 使用 MongoInternals 公开来自节点驱动程序的 mongo 连接,因此您可以使用它来调用聚合。

var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
var col = db.collection( 'yourCollection' );
var aggregateSync = Meteor._wrapAsync( col.aggregate.bind( col ) );
var pipeline = [{$match: {}},{$group: {_id: '$class', count:{$sum: 1}}} ];
var theAnswer = aggregateSync( pipeline );

aggregation pipeline 上的文档还允许您在需要时应用排序和限制等内容。


更新:通过使用$match 选择文档更正了管道数组。工作代码在 Meteor Pad

【讨论】:

  • 我试图在服务器端方法中使用它,我想这就是它应该去的地方?它基本上会说MongoInternals is not defined
  • 是的,代码用于服务器端。 Other discussions on MongoInternals。其他原因导致您的错误。
  • 今晚下班后我将不得不尝试一下,看看我做错了什么。我还将粘贴一些控制台输出。
猜你喜欢
  • 2021-10-01
  • 2022-01-26
  • 1970-01-01
  • 2017-06-22
  • 2019-06-25
  • 1970-01-01
  • 2017-09-13
  • 2017-07-26
  • 2021-09-18
相关资源
最近更新 更多