Méthodes d'agrégation mongoïdes sur les documents intégrés?
-
28-10-2019 - |
Question
Comment puis-je exécuter aggregate, min, max, sum et des amis sur les documents intégrés?
Par exemple:
Obtenez le coût moyen de TOUS les événements organisés par un district, où ils sont assez profondément intégrés.
District.schools.all.events.all.costs.avg(:value)
De toute évidence, cela ne fonctionne pas.
District.avg('schools.events.costs.value')
Cela non plus. Il donne ce message d'erreur:
Mongo::OperationFailure: Database command 'group' failed: (errmsg: 'exception: reduce
invoke failed: JS Error: TypeError: obj.schools
has no properties reduce setup:1'; code: '9010'; ok: '0.0').
Est-ce donc possible ou dois-je écrire mes propres fonctions de carte / réduction?
La solution
Oui, MapReduce fonctionnerait.Vous pouvez également utiliser des curseurs pour traiter un résultat de requête.Comme:
min = 99999999;
max = -99999999;
sum = 0;
count = 0
db.School.find({}).forEach(function(s) {
if (s.first.events.first.cost < min)
min = s.first.events.first.cost;
if (s.first.events.first.cost > max)
max = s.first.events.first.cost;
sum += s.first.events.first.cost;
++count;
});
Vous avez maintenant le min et le max et pouvez calculer la moyenne et la moyenne à partir de la somme et du nombre.
Mongodb n'a pas la possibilité de calculer directement les fonctions d'agrégation dans son langage de requête.En fait, cette affirmation n'est pas entièrement vraie, car il existe la fonction count () pour compter le nombre de résultats renvoyés par une requête, et il y a la fonction group ().Mais la fonction de groupe ressemble beaucoup à MapReduce et ne peut pas être utilisée sur des bases de données fragmentées.Si vous êtes intéressé par la fonction de groupe, voir: http://www.mongodb.org / display / DOCS / Aggregation # Aggregation-Group