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 № 1Lepiej 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.