/ / Mongodb Map-Reduce - mongodb, mapreduce

Mongodb Map-Reduce - mongodb, mapreduce

Dane w kolekcji wyglądają następująco:

[{
_id: 0001,
imei:"123456",
apps:[{packageName:"google"},{packageName:"twitter"}]

},{
_id: 0002,
imei:"654321",
apps:[{packageName:"facebook"},{packageName:"twitter"}
}]

chciałbym obliczyć packageName i imei użytkownika, tak jak poniżej:

[{
packageName:"facebook",
imeis:["123456"]
},{
packageName:"google",
imeis:["123456","654321"]
},{
packageName:"twitter",
imeis:["123456","654321"]

}]

moja funkcja mapy to:

function(){
emit(this.packageName,this.imei);
};

funkcja zmniejszania to:

function(key , values){
var ret = {packageName:key,imeis:values};
return ret;
};

Ale wynik ma tylko wartość packageName, imeis ma wartość null

może funkcja mapy była zła, ale nie wiem, jak ją przepisać.

Jestem nowy w MongoDB. Proszę, daj mi jakąś radę, thx

Odpowiedzi:

0 dla odpowiedzi № 1

Lepiej zrobić to za pomocą struktury agregacyjnej.

Jeśli masz nazwę kolekcji coll:

db.coll.aggregate([
{$unwind:"$apps"},
{$group:{
"_id" : "$apps.packageName",
"imeis" : { $addToSet: "$imei" }
}}
],{allowDiskUse: true}
)

The $ unwind agregacja spłaszcza apps szyk.

The $ group dokumenty grupy agregacji wg packageName. The $ addToSet grupa operatora imei unikalne wartości w tablicy.

allowDiskUse umożliwia używanie plików tymczasowych do etapów potoku agregacji, jeśli użycie pamięci przekracza limit (100 GB pamięci RAM). Alternatywnie możesz użyć mecz jako filtr kryteriów.