Похоже, что у вас есть документы с полями «userto» и «userfrom», и вы хотите суммировать количество документов, где «пользователь из» существует для определенного «userto», группируя «userfrom». Затем вы берете логарифм базы 10 каждой такой суммы и добавляете 1. Так как сокращение можно назвать итеративно, как написано, это может привести к регистрации логарифма частичной суммы, а затем взять лог этого результата. Возможно, это то, что вас беспокоит. Поэтому вы должны иметь mapReduce, просто получите подсчеты, и возьмите журнал и добавьте 1 после этого. Следующие работы для меня, используя MapReduce с MongoDB 2.4.6:
var id = "sam";
var query = {userto:id,userfrom:{$exists:true}};
var map = function() {
emit(this.userfrom, 1);
};
var reduce = function (id,emits) {
return Array.sum(emits);
};
db.foo.mapReduce(map, reduce, {
"query": query,
"out": "foo_out"
});
Входные и выходные являются:
# input
{ "_id" : ObjectId("523750e41e31334eb99aae73"), "userfrom" : "dave", "userto" : "sam" }
{ "_id" : ObjectId("523750fa1e31334eb99aae74"), "userfrom" : "kyle", "userto" : "sam" }
{ "_id" : ObjectId("523753571e31334eb99aae75"), "userfrom" : "kyle", "userto" : "sam" }
{ "_id" : ObjectId("523753581e31334eb99aae76"), "userfrom" : "kyle", "userto" : "sam" }
{ "_id" : ObjectId("5237535c1e31334eb99aae77"), "userfrom" : "dave", "userto" : "sam" }
# output
{ "_id" : "dave", "value" : 2 }
{ "_id" : "kyle", "value" : 3 }
Кроме того, какая версия MongoDB вы работаете? Модернизация может быть полезна.
При этом для большинства задач агрегации, таких как этот, лучше всего использовать MongoDB aggregation framework, новый в версии 2.2. Структура агрегации была разработана с учетом производительности и удобства использования, поэтому часто предпочитают mapReduce, если вы не делаете что-то специализированное. Следующее решение этой проблемы решается с использованием структуры агрегации вместо mapReduce:
db.foo.aggregate([
{$match: {userto: "sam"}},
{$group: {_id: "$userfrom", count: {$sum: 1}}}
]);
Это действительно полезно. Я беру log out от уменьшения, и теперь, кажется, работает. Я осведомлен о структурах агрегации, к сожалению, мой код более сложный, это был просто тест. Спасибо огромное! – ke2g
Без проблем, рад, что смогу помочь –