我有一个包含多个文档的集合,并且每个文档都有&eid' eID'不唯一的字段。我想得到所有不同的eID'
的计数示例:如果有5个文档带有' eID' = ObjectID(123)和2个带有' eID' = ObjectID(321)我想输出类似的东西:
{
ObjectID(123): 5,
ObjectID(321): 2
}
我不知道是否可以在同一个查询中完成,但在知道哪些是最常见的eID之后我想使用ObjectID获取引用的文档
Mongoose版本3.8.8
答案 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