2014-09-05 6 views
1

J'apprends l'agrégat dans mongodb. Je travaille avec la collection:Collection d'agrégats Mongodb

    { 
          "body" : "" 
    , 
        "email" : "[email protected]", 
        "author" : "Linnie Weigel" 
      }, 
      { 
        "body" : "" 
    , 
        "email" : "[email protected]", 
        "author" : "Dinah Sauve" 
      }, 
      { 
        "body" : "" 
    , 
        "email" : "[email protected]", 
        "author" : "Zachary Langlais" 
      } 
      { 
        "body" : "" 
    , 
        "email" : "[email protected]", 
        "author" : "Jesusa Rickenbacker" 
      } 
    ] 

J'essaie d'obtenir le numéro de corps de chaque auteur. Mais quand j'exécute la commande sum de l'agrégat mongodb, le résultat est 1 (car la structure n'a qu'un seul élément). Comment puis-je faire cette opération? J'ai essayé avec $ addToSet. Mais je ne sais pas comment obtenir chaque élément de collection et faire l'opération.

+0

Pourriez-vous s'il vous plaît inclure le code que vous avez utilisé? Est-ce que c'est aussi votre mission universitaire mongodb? –

+0

Vous dites "exécuter la commande sum" - il n'y a pas une telle commande. Parlez-vous de l'étape $ group où vous pouvez utiliser l'opérateur $ sum pour obtenir votre réponse (à condition que vous vous regroupiez dans le bon champ). –

+0

Mon code est var groupe = {$ groupe: {_ id: "$ auteur", total: {$ addToSet: "$ commentaires.author"}}}: –

Répondre

2

Pour compter les commentaires de chaque auteur que vous voulez $group par cet auteur et $sum les occurrences. Fondamentalement, juste une opération "$ sum: 1". Mais il semble que vous ayez des "commentaires" sous la forme d'un tableau basé sur vos propres commentaires et sur le crochet de clôture de votre liste de données partielle. Pour cela, vous devez traiter avec $unwind premier:

db.collection.aggregate([ 
    { "$unwind": "$comments" }, 
    { "$group": { 
     "_id": "$comments.author", 
     "count": { "$sum": 1 } 
    }} 
]) 

Ce sera obtenir le total de tous les commentaires de l'auteur par l'auteur pour la collection. Si vous étiez juste après avoir reçu les commentaires au total par auteur par document (ou ce qui ressemble à un modèle de blog), vous utilisez le document _id dans le cadre de la déclaration du groupe:

db.collection.aggregate([ 
    { "$unwind": "$comments" }, 
    { "$group": { 
     "_id": { 
      "_id": "$_id" 
      "author": "$comments.author" 
     }, 
     "count": { "$sum": 1 } 
    }} 
]) 

Et si vous voulez ensuite le résumé de l'auteur compte par document avec un seul document retourné avec tous les auteurs dans un tableau, puis utilisez $addToSet d'ici, avec un autre étage de pipeline $group:

db.collection.aggregate([ 
    { "$unwind": "$comments" }, 
    { "$group": { 
     "_id": { 
      "_id": "$_id" 
      "author": "$comments.author" 
     }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$group": { 
     "_id": "$_id._id", 
     "comments": { 
      "$addToSet": { 
       "author": "$_id.author", 
       "count": "$count" 
      } 
     } 
    }} 
]) 

Mais vraiment, les valeurs de l'auteur sont déjà uniques et « ensembles "ne sont pas commandés de quelque façon que ce soit, vous pouvez donc changer ceci en utilisant $push après la première introduction d'un $sort d'avoir la liste ordonnée par le nombre de commentaires:

db.collection.aggregate([ 
    { "$unwind": "$comments" }, 
    { "$group": { 
     "_id": { 
      "_id": "$_id" 
      "author": "$comments.author" 
     }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$sort": { "_id._id": 1, "count": -1 } }, 
    { "$group": { 
     "_id": "$_id._id", 
     "comments": { 
      "$push": { 
       "author": "$_id.author", 
       "count": "$count" 
      } 
     } 
    }} 
]) 
Questions connexes