2017-08-15 1 views
0

En essayant d'obtenir une somme de contenu qu'un utilisateur a aimé, partagé ou commenté.MongoDb agréger le nombre/somme de 3 champs

mon modèle de contenu a la structure suivante. Maintenant, id comme d'agréger sur les documents de contenu, et obtenir un résultat comme

Content = { 
    _id: ObjectId(), 
    author: ObjectId(), 
    value: <string of post content> 
    tags: [<trings>], 
    likes: [array of user ids], 
    shares: [array of user ids], 
    comments: [{ 
    ContentId(of the same schema), 
    User Id 
    }] 
} 

cela.

{ 
    likes: 20, 
    shares: 10, 
    comments: 5 
} 

Donc, en bref, chaque fois qu'il ya un contenu, où id utilisateur est en aime tableau, aime s'incrémente par 1.

Même pour les actions et les commentaires.

Je ne sais pas si cela est possible avec le cadre d'agrégation. Je ne pense pas, mais peut-être certains gourous mongodb savoir mieux

Quick Edit. Partiellement basé sur le premier post soumis, j'ai fait cela. Maintenant, il semble fonctionner, mais je suis sûr qu'il ya une sorte de chasse aux sorcières, qui im ​​manque, car il semble trop simple :)

db.getCollection('contents').aggregate([ 


{$facet: { 
     "likes": [ 
     {$match: {likes: ObjectId("596537d6b63edc2318ee9f0c")} }, 
     {$group: { 
      _id : "$likes", 
      count: { $sum: 1 } 
     }}, 
     { $project: { count: 1} } 
     ], 
     "shares": [ 
     {$match: {shares: ObjectId("596537d6b63edc2318ee9f0c")} }, 
     {$group: { 
      _id : "$shares", 
      count: { $sum: 1 } 
     }}, 
     { $project: { count: 1} } 
     ], 
     "posts": [ 
     {$match: {$and: [ 
      {user: ObjectId("596537d6b63edc2318ee9f0c")}, 
      {parent: {$exists: false} } 
     ]} }, 
     {$group: { 
      _id : "$_id", 
      count: { $sum: 1 } 
     }}, 
     { $project: { count: 1} } 
     ] 
    } 
}]); 

Pouvez-vous trouver quelque chose de mal avec le code ci-dessus?

Répondre

0

Vous pouvez essayer l'agrégation ci-dessous dans la version 3.4.

La requête ci-dessous va $group tous les documents et utiliser $in opérateur pour vérifier si l'entrée user_id est dans les tableaux.

Pour likes et tableau shares, utilisez 1 si le user_id se trouve le reste est réglé 0 et $sum à regrouper sur tous les documents.

Pour comments, il s'agit d'un processus en deux étapes car il s'agit d'un tableau de tableaux.

$group ing étape pour passer en revue les années user_id dans le document de contenu et de vérifier l'entrée user_id dans chaque élément et de sortie 1 si cela correspond et d'autre 0.

Le comments aura un tableau de valeurs de tableau [[1, 0], [1], [1]] après l'étape de groupe. La prochaine étape consiste à additionner toutes les valeurs pour obtenir le nombre comments en utilisant l'opérateur $reduce.

db.collection_name.aggregate([ 
    { 
    "$group": { 
     "_id": null, 
     "likes": { 
     "$sum": { 
      "$cond": [ 
      { 
       "$in": [ 
       user_id, 
       "$likes" 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     "shares": { 
     "$sum": { 
      "$cond": [ 
      { 
       "$in": [ 
       user_id, 
       "$shares" 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     "comments": { 
     "$push": { 
      "$map": { 
      "input": "$comments", 
      "as": "comment", 
      "in": { 
       "$cond": [ 
       { 
        "$in": [ 
        user_id, 
        "$$comment.user_id" 
        ] 
       }, 
       1, 
       0 
       ] 
      } 
      } 
     } 
     } 
    } 
    }, 
    { 
    "$addFields": { 
     "comments": { 
     "$reduce": { 
      "input": "$comments", 
      "initialValue": 0, 
      "in": { 
      "$add": [ 
       "$$value", 
       { 
       "$sum": "$$this" 
       } 
      ] 
      } 
     } 
     } 
    } 
    } 
]) 
0
db.collection.aggregate([ 
    { 
    $facet: { 
     "LikeCategory": [ 
     { $unwind: "$likes" }, 
     { $group : { 
      _id : "$likes", 
      count: { $sum: 1 } 
     } 
     },{ $project : { 
      userId : "$_id" 
      _id : 0, 
      count : 1 

     }} 
     ], 
     "ShareCategory": [ 
     { $unwind: "$shares" }, 
     { $group : { 
      _id : "$shares", 
      count: { $sum: 1 } 
     } 
     },{ $project : { 
      userId : "$_id" 
      _id : 0, 
      count : 1 

     }} 
     ], 
     "CommentCategory": [ 
     { $unwind: "$comments" }, 
     { $group : { 
      _id : "$comments.userId", 
      count: { $sum: 1 } 
     } 
     },{ $project : { 
      userId : "$_id" 
      _id : 0, 
      count : 1 

     }} 
     ] 
} 
} 
]; 

De cette façon, vous serez en mesure de trouver les chiffres. Au-dessus du code peut avoir quelques problèmes de syntaxe, mais j'espère que vous serez en mesure de résoudre votre problème.