1

J'ai deux collections; users et communities. Mes utilisateurs peuvent être liés à de nombreuses communautés, donc j'ai linkedCommunities comme un tableau dans le schéma de l'utilisateur en tant que tel:Comment agréger le nombre d'occurrences d'un ObjectID dans un tableau?

const userSchema = new Schema({ 
    linkedCommunities: [ 
    { 
     type: mongoose.Schema.ObjectId, 
     ref: 'Community' 
    } 
    ] 
}); 

Sur mon communities vue je veux afficher le nombre de users lié à chaque communauté, il liraient quelque chose comme:

| Community | Number of users | 
| --------- | --------------- | 
| Community 1 | 45    | 
| Community 2 | 78    | 
| Community 4 | 107    | 

Idéalement, quand je fais une découverte sur le modèle Community Je veux un champ appelé quelque chose comme linkedUserCount.

Je suis sûr que je peux réaliser cela en utilisant aggregate d'une manière ou d'une autre mais j'ai du mal à trouver les bons opérateurs de pipelines et ordre.

Répondre

1

Vous pouvez obtenir le résultat requis en utilisant la requête suivante MongoDB:

db.users.aggregate([ 
    { 
    $unwind : "$linkedCommunities" 
    }, 
    { 
    $group : { 
     _id : "$linkedCommunities", 
     count: { $sum: 1 } 
    } 
    }, 
    { 
    $project: { 
     _id: 0, 
     community: "$_id", 
     count: "$count" 
    } 
    } 
]) 

Donnez-lui un essai et laissez-moi savoir si vous avez des problèmes.

+0

C'est parfait pour me donner les comtes. Merci. Maintenant, j'ai juste besoin de comprendre comment relier le tout. –

2

Ici Peut-être peut aider u,

users.aggregate([ 
{ 
    $lookup: 
     { 
      from: "Community", 
      localField: "linkedCommunities", 
      foreignField: "_id", 
      as: "linkedcommunities" 
     }} 
,{ 
    $unwind: "$linkedCommunities" 
}, 
{ 
    $group : { 
     _id : "$linkedCommunities", 
     count: { $sum: 1 } 
    } 
}, 
{ 
    $project: { 
     _id: 0, 
     community: "$_id", 
     count: "$count" 
    } 
}]}