Vous pouvez le faire dans mongoDB en utilisant Aggregation Framework (nouveau dans la version 2.2).
Vous devez disposer du tableau des communautés d'utilisateurs. Je l'appellerai userComms dans cet exemple - je m'attends à ce qu'il s'agisse d'un tableau avec le même type de valeurs que posts.communities.
db.posts.aggregate( [
{
"$unwind" : "$communities"
},
{
"$match" : {
"communities" : {
"$in" : userComms
}
}
},
{
"$group" : {
"_id" : "$_id",
"relevance" : {
"$sum" : 1
}
}
},
{
"$sort" : {
"relevance" : -1
}
}
]);
Cela renvoie un document de la forme :
{
"result" : [
{
"_id" : 1,
"relevance" : 4
},
{
"_id" : 6,
"relevance" : 3
},
...
]
}
Le tableau de résultats contient des _ids de messages et pertinents tels que calculés en ajoutant le nombre de communautés qu'ils avaient en commun avec l'utilisateur. Ensuite, il est trié (décroissant) par cette somme.