Eftersom MongoDB inte har ett koncept för joins måste du arbeta med detta genom att minska din input till ett enda dokument.
Om du ändrar din dokumentstruktur så att du lagrar en rad taggar, som följande:
{id: 123, tag:["tag1","tag2","tag3"]}
{id: 456, tag:["tag1"]}
Du kan göra en fråga som följande:
db.user.find({$and:[{tag:"tag1"},{tag:"tag2"},{tag:"tag3"}]})
Om det behövs kan du skriva en map-reduce för att sända ut en rad taggar för ett användar-id, så att du kan göra ovanstående fråga på det.
Redigera – inklusive en enkel kartförminskning
Här är en riktigt enkel kartreducering för att få den initiala inmatningen till ett format som är användbart för find
fråga ovan.
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"})
Sedan kan du fråga på kart-reducera utdatasamlingen, som följande:
db.mr_results.find({$and:[{"value.tag":"tag1"},{"value.tag":"tag2"}, {"value.tag":"tag3"}]})