MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Anwenden einer Bedingung auf mehrere Dokumente für dasselbe Feld in MongoDB

Da MongoDB kein Join-Konzept hat, müssen Sie dies berücksichtigen, indem Sie Ihre Eingaben auf ein einziges Dokument reduzieren.

Wenn Sie Ihre Dokumentstruktur so ändern, dass Sie ein Array von Tags wie das folgende speichern:

{id: 123,  tag:["tag1","tag2","tag3"]}
{id: 456,  tag:["tag1"]}

Sie können eine Abfrage wie die folgende durchführen:

db.user.find({$and:[{tag:"tag1"},{tag:"tag2"},{tag:"tag3"}]})

Bei Bedarf könnten Sie ein map-reduce schreiben, um ein Array von Tags für eine Benutzer-ID auszugeben, sodass Sie die obige Abfrage darauf ausführen können.

Bearbeiten - Einschließlich einer einfachen Kartenreduzierung

Hier ist eine wirklich einfache Map-Reduzierung, um die anfängliche Eingabe in ein Format zu bringen, das für find nützlich ist oben angegebene Abfrage.

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

Dann können Sie die Map-Reduce-Ausgabesammlung wie folgt abfragen:

db.mr_results.find({$and:[{"value.tag":"tag1"},{"value.tag":"tag2"}, {"value.tag":"tag3"}]})