节点,MongoDB(mongoose)不同的计数

我有一个包含多个文档的集合,每个文档都有一个不唯一的“eID”字段。 我想要得到所有不同的“eID”的计数。

例如:如果有5个文档的'eID'= ObjectID(123)和2个文档的'eID'= ObjectID(321)我想输出如下所示:

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

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

mongoose版本3.8.8

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

  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 } ] 

这个答案并不在于如何通过mongoose来写这个查询,但是如果你有关于实现的更多问题,我已经熟悉了nodejs MongoClient类。

我能想到的最好的(最优化的)方法是在你的数据库上使用mapReduce或聚合。 最接近单个命令的是distinct命令,它可以在集合上调用,但这只会给你一个eID键的不同值。

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

对于你的具体问题,你会想要你的地图和减lessfunction大致如下:

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; };

有可能是一个更简单的方法来做到这一点使用聚合pipe道(我会张贴链接,但我没有足够的声誉)。

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