2014-03-30 29 views
2

我有一個包含多個文檔的集合,每個文檔都有一個不唯一的'eID'字段。我想要得到所有不同'eID'的計數。節點,MongoDB(貓鼬)截然不同的計數

示例:如果有5個文件用 '的eID'=的ObjectID(123)和2個文件用 '的eID'=的ObjectID(321)我想輸出是這樣的:

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

我不知道如果能在同一個查詢,但知道後做什麼是最ocurring的eID的我想用對象ID

貓鼬版本3.8.8

回答

1

這個答案是不計獲取的參考文件如何通過貓鼬這個查詢,但我很熟悉無線如果您有關於實現的更多問題,請參閱nodejs MongoClient類。

我能想到的最好的(最優化的)方法是使用mapReduce或數據庫聚合。最接近單個命令的是不同命令,該命令可以在集合上調用,但這隻會爲您提供一組不同的值,用於密鑰。

在這裏看到: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; };

有可能是一個更簡單的方法來做到這一點使用聚合管道(我會張貼鏈接,但我沒有足夠的聲望)。

我還發現了MapReduce的命令獴:http://mongoosejs.com/docs/api.html#model_Model.mapReduce

2

$狀態收集的具體領域,我需要計算元素的不同數量。

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