2017-10-15 2 views
0

J'ai une collection « tagsCount » qui ressemble à ce que:sommes groupe d'un attribut par les valeurs d'un autre tableau d'attributs

{ 
    "_id" : ObjectId("59e3a46a48507851d411ad78"), 
    "tags" : [ "Marketing" ], 
    "cpt" : 14354 
}, 
{ 
    "_id" : ObjectId("59e3a46a48507851d411ad79"), 
    "tags" : [ 
     "chatbot", 
     "Content marketing", 
     "Intelligence artificielle", 
     "Marketing digital", 
     "Personnalisation" 
    ], 
    "cpt" : 9037 
} 

Bien sûr, il y a beaucoup plus de lignes.

Je veux obtenir la somme de "cpt" groupée par les valeurs de "tags".

Je suis venu avec cette:

db.tagsCount.aggregate([ 
    { "$project": { "tags":1 }}, 
    { "$unwind": "$tags"}, 
    { "$group": { 
     "_id" : "$tags", 
     cpt : "$cpt" , 
     "count": { "$sum": "$cpt" } 
    }} 
]) 

Mais cela ne veut pas faire l'affaire, je la liste de toutes les différentes balises et le nombre ont une valeur 0.

Est-il possible de faire ce que je veux?

+0

Votre 'étape de group' de $ n'est pas valide. Pensez également à nous montrer le résultat attendu. – styvane

+1

Essayez '{ "$ group": { "_id": "$ tags", "count": { "somme $": "cpt $"} }}' – Veeram

+0

@sstyvane Je modifié le 'group' de $ étape. – PPaFeu

Répondre

1

Le problème est que votre pipeline d'agrégation commence par projet $ qui sélectionne les balises uniquement pour les prochaines étapes et qui est la raison pour laquelle vous exécuter groupe $ sur les documents sans cpt. Voici mon exemple de travail:

db.tagsCount.aggregate([ 
    { "$unwind": "$tags"}, 
    { "$group": { 
     "_id": "$tags", 
     "count": { "$sum": "$cpt" } 
    }}, 
    { "$project": { "tag": "$_id", "_id": 0, "count": 1 }} 

])

+0

Merci. Je vais essayer ça. Je suis vraiment nouveau chez mongodb et je n'ai pas encore vraiment compris '$ project', donc ça a du sens, j'ai raté ça. – PPaFeu