MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Application d'une condition à plusieurs documents pour le même champ dans MongoDB

É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"}]})