Node.js 节点,MongoDB(mongoose)不同计数

Node.js 节点,MongoDB(mongoose)不同计数,node.js,mongodb,count,mongoose,distinct,Node.js,Mongodb,Count,Mongoose,Distinct,我有一个包含多个文档的集合,其中每个文档都有一个非唯一的“eID”字段。我想得到所有不同的“eID”的计数 示例:如果有5个文档的'eID'=ObjectID(123)和2个文档的'eID'=ObjectID(321),我希望输出如下内容: { ObjectID(123): 5, ObjectID(321): 2 } 我不知道是否可以在同一个查询中完成,但在知道最常见的eID是什么之后,我想使用ObjectID获取引用的文档 Mongoose版本3.8.8这个答案不是关于如何通过M

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

示例:如果有5个文档的'eID'=ObjectID(123)和2个文档的'eID'=ObjectID(321),我希望输出如下内容:

{
   ObjectID(123): 5,
   ObjectID(321): 2
}
我不知道是否可以在同一个查询中完成,但在知道最常见的eID是什么之后,我想使用ObjectID获取引用的文档


Mongoose版本3.8.8

这个答案不是关于如何通过Mongoose编写这个查询,但是如果您对实现有进一步的疑问,我对nodejs MongoClient类很熟悉

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

请看这里:

对于您的具体问题,您需要大致如下所示的map和reduce函数:


var map=function(){
var值=1;
emit(this.eID,value);
};
var reduce=函数(键、值){
var结果=0;

for(var i=-1;++i$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
  }
]