通过汇总MongoDB中的聚合字典查找查询

时间:2016-12-14 01:42:15

标签: mongodb

我有一个db集合,用户,看起来像这样:

{"_id": ObjectId("4d2407265ff08824e3000001"), "karma": {"category1" : 5, "category2": 1, "category3": 7}} 
{"_id": ObjectId("4d2551b4ae9fa739640df821"), "karma": {"category1" : 1, "category3": 2, "category4": 3}} 
{"_id": ObjectId("4d255b115ff08821c2000001"), "karma": {"category2" : 6, "category3": 6, "category4": 6}} 

我想从业力词典(总业力)中总结所有业力值,并按降序对结果进行排序并限制为2,所以理想情况下我会返回一个列表:

{"_id": ObjectId("4d255b115ff08821c2000001"), "totalKarma": 18} 
{"_id": ObjectId("4d2407265ff08824e3000001"), "totalKarma": 13}

每个业力词典都不一定包含相同的键。

1 个答案:

答案 0 :(得分:1)

您可以使用mapReduce。这是一个大致的想法:

首先,您必须编写一个map函数,该函数将为reduce函数发出值以供使用:

var map = function(){
  /* emit values for each document */
  emit(key, value);
}

其次,你必须写reduce函数:

var reduce = function(key, value){
  //Here you'll sum all properties in 'karma' object
  var sum = 0;

  for(var karma in value){
    sum += parseInt(value[karma]);
  }

  return {"_id": key, "totalKarma": result};
}

然后你可以像这样运行它:

db.users.mapReduce(map, reduce, { out: "collectionToOutputTheResult" });

或者您可以在js文件&中写下以上所有内容。像这样运行:

mongo localhost:27017/users script.js

Here's mapReduce的文档。