J'ai 2 collections:globale et mise à jour MongoDB
- clients (6 000 000 documents)
- commandes (50 000 000 documents)
Une fois par jour, je voudrais calculer le nombre de commandes de l'année écoulée, du mois passé et de la semaine écoulée, et ainsi de suite, par client.
J'ai essayé ceci:
db.orders.aggregate(
{$match:
{ date_order: { $gt: v_date1year } }
},
{$group : {
_id : "$id_client",
count : {$sum : 1}
}} ,
{
"$out": "tmp_indicators"
}
)
db.tmp_indicators.find({}).forEach(function (my_client) {
db.clients.update (
{"id_client": my_client._id},
{"$set":
{ "nb_orders_1year" : my_client.count }
}
)
})
Je dois faire cela 3 fois, 1 pour l'agrégation de la dernière année, 1 pour le mois passé et 1 pour la semaine dernière. Le traitement est très lent, avez-vous une idée de comment l'améliorer?
Merci pour la solution, mais en utilisant un curseur ne travailler en raison de la limitation de taille du document. J'ai ce problème "exception: résultat d'agrégation dépasse la taille maximale du document (16 Mo)". C'est pourquoi j'ai utilisé l'utilitaire "$ out" – Mouette
@Mouette Vous avez raison, je n'avais pas factorisé cela dans ma réponse initiale mais j'ai depuis mis à jour ma réponse pour utiliser le curseur de la collection de sortie d'agrégation. – chridam
Si la première solution, quel est le but de l'exécution du volume toutes les 1000 opérations? L'utilitaire en vrac ne peut-il pas gérer 6 000 000 mises à jour (1 par client max) en une seule fois? – Mouette