Você pode fazer isso no mongoDB usando Aggregation Framework (novo na versão 2.2).
Você precisa ter a matriz de comunidades de usuários disponíveis. Vou chamá-lo de userComms neste exemplo - espero que seja um array com o mesmo tipo de valores que posts.communities são.
db.posts.aggregate( [
{
"$unwind" : "$communities"
},
{
"$match" : {
"communities" : {
"$in" : userComms
}
}
},
{
"$group" : {
"_id" : "$_id",
"relevance" : {
"$sum" : 1
}
}
},
{
"$sort" : {
"relevance" : -1
}
}
]);
Isso retorna um documento do formulário:
{
"result" : [
{
"_id" : 1,
"relevance" : 4
},
{
"_id" : 6,
"relevance" : 3
},
...
]
}
A matriz de resultados contém _ids de postagens e relevantes conforme calculado adicionando o número de comunidades que elas tinham em comum com o usuário. Em seguida, é classificado (decrescente) por essa soma.