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?