我有一个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}
每个业力词典都不一定包含相同的键。
答案 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
的文档。