Mongodb peut gérer ce que vous voulez, si vous avez stocké vos objets comme ça
{ score:2131, attributes: ["attr1", "attr2", "attr3"], ... }
Ensuite, la requête suivante correspondra à tous les éléments qui ont att1 et attr2
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] } })
mais cela ne correspondra pas
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr4" ] } })
la requête renvoie un curseur, si vous voulez que ce curseur soit trié, ajoutez simplement les paramètres de tri à la requête comme ceci
c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] }}).sort({score:1})
Jetez un œil à Requêtes avancées pour voir ce qui est possible.
Les index appropriés peuvent être configurés comme suit
db.mycol.ensureIndex({attributes:1, score:1})
Et vous pouvez obtenir des informations sur les performances en utilisant
db.mycol.find({ attributes: { $all: [ "attr1" ] }}).explain()
Mongo explique combien d'objets ont été scannés, combien de temps l'opération a duré et diverses autres statistiques.