#javascript #mongodb #mapreduce
#javascript #mongodb #mapreduce
Вопрос:
У меня есть коллекция mongodb, которая содержит следующие данные :
{ "_id" : ObjectId("4da31b8b5ba19e3c11345a66"), "USERID" : 4, "datekey" : "BIBAK", "balancekey" : "MAIYM" }
{ "_id" : ObjectId("4da31b8b5ba19e3c12345a66"), "USERID" : 4, "datekey" : "QOTWH", "balancekey" : "SFEYQ" }
{ "_id" : ObjectId("4da31b8b5ba19e3c14345a66"), "USERID" : 4, "datekey" : "TLWJJ", "balancekey" : "RDKAM" }
{ "_id" : ObjectId("4da31b8b5ba19e3c15345a66"), "USERID" : 5, "emailadress" : "KBDIJD" }
{ "_id" : ObjectId("4da31b8b5ba19e3c16345a66"), "USERID" : 1, "accountname" : "KL", "weblink" : "GJ", "note" : "KP" }
{ "_id" : ObjectId("4da31b8b5ba19e3c17345a66"), "USERID" : 1, "accountname" : "WD", "weblink" : "SZ", "note" : "CL" }
{ "_id" : ObjectId("4da31b8b5ba19e3c18345a66"), "USERID" : 1, "accountname" : "IK", "weblink" : "OK", "note" : "HD" }
{ "_id" : ObjectId("4da31b8b5ba19e3c19345a66"), "USERID" : 4, "datekey" : "UGBYH", "balancekey" : "VOPRX" }
{ "_id" : ObjectId("4da31b8b5ba19e3c1a345a66"), "USERID" : 3, "userid" : "ZBWD", "password" : "FZAK", "key" : "QMEE" }
{ "_id" : ObjectId("4da31b8b5ba19e3c1b345a66"), "USERID" : 1, "accountname" : "GH", "weblink" : "MY", "note" : "QU" }
{ "_id" : ObjectId("4da31b8b5ba19e3c1c345a66"), "USERID" : 3, "userid" : "YZMW", "password" : "MVUR", "key" : "YSZC" }
{ "_id" : ObjectId("4da31b8b5ba19e3c1d345a66"), "USERID" : 4, "datekey" : "LIEWF", "balancekey" : "THXYR" }
{ "_id" : ObjectId("4da31b8b5ba19e3c1e345a66"), "USERID" : 4, "datekey" : "UIWOY", "balancekey" : "SKOKG" }
{ "_id" : ObjectId("4da31b8b5ba19e3c1f345a66"), "USERID" : 4, "datekey" : "POYKK", "balancekey" : "KZGDZ" }
{ "_id" : ObjectId("4da31b8b5ba19e3c20345a66"), "USERID" : 4, "datekey" : "LWNXW", "balancekey" : "VJXFC" }
{ "_id" : ObjectId("4da31b8b5ba19e3c23345a66"), "USERID" : 4, "datekey" : "IYMGO", "balancekey" : "RWBUE" }
{ "_id" : ObjectId("4da31b8b5ba19e3c24345a66"), "USERID" : 3, "userid" : "CJTH", "password" : "YQCL", "key" : "PCDB" }
{ "_id" : ObjectId("4da31b8b5ba19e3c25345a66"), "USERID" : 4, "datekey" : "OBOCN", "balancekey" : "XOHWA" }
{ "_id" : ObjectId("4da31b8b5ba19e3c26345a66"), "USERID" : 3, "userid" : "EHTQ", "password" : "KBXV", "key" : "YAMD" }
{ "_id" : ObjectId("4da31b8b5ba19e3c27345a66"), "USERID" : 5, "emailadress" : "VYSAHK" }
Мне нужна помощь в написании функций mapreduce для генерации строки, которая была бы похожа на структуру csv.. так, например, если мне нужны данные для userid = 4, результатом будет
datekey,balancekeyn
BIBAK,MAIYMn
QOTWH,SFEYQn
......
Я столкнулся с проблемой, связанной со следующим.. Поскольку каждый идентификатор пользователя имеет разные данные, мне нужен способ перебирать эти пары ключ / значение общим способом .. Итак, в значительной степени вопрос заключается в том, как перебирать параметры объектов и получать их значения, чтобы выдавать их. а затем в функции reduce я могу объединить их и добавить n.
Спасибо
Комментарии:
1. Вы читали mongodb.org/display/DOCS/MapReduce ?
Ответ №1:
Вы можете получить значения csv для каждого документа, используя следующий код. В качестве примера представлены два варианта функции map(). Первый из них не является универсальным и помогает понять концепцию. В то время как один, в конце, является общим. Попробуйте запустить их оба, и вы поймете разницу.
Функция отображения — не универсальная
var map = function() {
var outputString = "";
if (this.datekey){
outputString = this.datekey;
}
outputString = "," ;
if (this.balancekey){
outputString = this.balancekey;
}
emit(this.USERID, {outputString:outputString});
};
Функция уменьшения
var reduce = function(key,values){
overallOutputString = "";
values.forEach(function(i){
overallOutputString = i.outputString "n";
});
return { outputString:overallOutputString};
};
Выполнение операции M / R
var result = db.items.mapReduce( map,
reduce,
{query:{USERID:{$exists:true}},
out: {replace:"csv_dump"}
});
Наблюдая за выводом
db.csv_dump.find();
Функция отображения — Универсальный
var map = function() {
var outputString = "";
for(var prop in this ) {
if (prop != "_id" amp;amp; prop != "USERID" ){
outputString = this[prop] ",";
}
}
outputString = outputString.substring(0, outputString.length-1); // removing last comma
emit(this.USERID, {outputString:outputString});
};