Node,MongoDB(mongoose)明显不计

时间:2014-03-30 16:52:05

标签: node.js mongodb count mongoose distinct

我有一个包含多个文档的集合,并且每个文档都有&eid' eID'不唯一的字段。我想得到所有不同的eID'

的计数

示例:如果有5个文档带有' eID' = ObjectID(123)和2个带有' eID' = ObjectID(321)我想输出类似的东西:

{
   ObjectID(123): 5,
   ObjectID(321): 2
}

我不知道是否可以在同一个查询中完成,但在知道哪些是最常见的eID之后我想使用ObjectID获取引用的文档

Mongoose版本3.8.8

2 个答案:

答案 0 :(得分:4)

$ status是我需要计算不同数量元素的特定集合字段。

          var agg = [
            {$group: {
              _id: "$status",
              total: {$sum: 1}
            }}
          ];

          model.Site.aggregate(agg, function(err, logs){
            if (err) { return res.json(err); }

            return res.json(logs);
          });

//output
[
  {
    "_id": "plan",
    "total": 3
  },
  {
    "_id": "complete",
    "total": 4
  },
  {
    "_id": "hault",
    "total": 2
  },
  {
    "_id": "incomplete",
    "total": 4
  }
]

答案 1 :(得分:1)

这个答案不是关于如何通过mongoose编写这个查询的,但如果你对实现还有其他问题,我对nodejs MongoClient类很熟悉。

我能想到的最佳(最佳)方式是在数据库上使用mapReduce或聚合。与单个命令最接近的是 distinct 命令,可以在集合上调用,但这只会为您提供 eID 键的不同值数组。

见这里:http://docs.mongodb.org/manual/core/map-reduce/

针对您的具体问题,您需要大致如下地图和缩小功能:

var map = function() { var value = 1; emit(this.eID, value); }; var reduce = function(key, values) { var result = 0; for(var i=-1;++i<values.length;){ var value = values[i]; result += value; }; return result; };

使用聚合管道可能有一种更简单的方法(我会发布链接,但我没有足够的声誉)。

我还找到了mongoose的mapReduce命令:http://mongoosejs.com/docs/api.html#model_Model.mapReduce