Étant donné que MongoDB n'a pas de concept de jointures, vous devez résoudre ce problème en réduisant votre entrée à un seul document.
Si vous modifiez la structure de votre document afin de stocker un tableau de balises, comme suit :
{id: 123, tag:["tag1","tag2","tag3"]}
{id: 456, tag:["tag1"]}
Vous pouvez effectuer une requête comme celle-ci :
db.user.find({$and:[{tag:"tag1"},{tag:"tag2"},{tag:"tag3"}]})
Si nécessaire, vous pouvez écrire un map-reduce pour émettre un tableau de balises pour un ID utilisateur, afin que vous puissiez faire la requête ci-dessus dessus.
Modifier - Inclure une simple réduction de carte
Voici une réduction de carte très simple pour obtenir l'entrée initiale dans un format utile pour la find
requête donnée ci-dessus.
var map = function() {emit(this.id, {tag:[this.tag]});}
var reduce = function(key, values){
var result_array=[];
values.forEach(function(v1){
v1.tag.forEach(function(v2){
result_array.push(v2);
});
});
return {"tag":result_array};}
var op = db.user.mapReduce(map, reduce, {out:"mr_results"})
Ensuite, vous pouvez interroger la collection de sortie map-reduce, comme suit :
db.mr_results.find({$and:[{"value.tag":"tag1"},{"value.tag":"tag2"}, {"value.tag":"tag3"}]})