【问题标题】:Node, MongoDB (mongoose) distinct count节点,MongoDB(猫鼬)不同的计数
【发布时间】:2014-05-09 22:06:20
【问题描述】:

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

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

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

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

猫鼬版本 3.8.8

【问题讨论】:

    标签: node.js mongodb count mongoose distinct


    【解决方案1】:

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

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

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

    对于您的具体问题,您将希望您的 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 1970-01-01
        • 2017-10-08
        • 2018-12-03
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 2019-07-01
        • 2013-12-08
        相关资源
        最近更新 更多