Тъй като MongoDB няма концепция за обединения, трябва да работите върху това, като намалите въвеждането си до един документ.
Ако промените структурата на вашия документ, така че да съхранявате масив от тагове, като следното:
{id: 123, tag:["tag1","tag2","tag3"]}
{id: 456, tag:["tag1"]}
Можете да направите заявка като следната:
db.user.find({$and:[{tag:"tag1"},{tag:"tag2"},{tag:"tag3"}]})
Ако е необходимо, можете да напишете map-reduce, за да излъчвате масив от тагове за потребителски идентификатор, така че да можете да направите горната заявка върху него.
Редактиране – Включително просто намаляване на картата
Ето едно наистина просто map-reduce, за да получите първоначалния вход във формат, който е полезен за find
заявка, дадена по-горе.
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"})
След това можете да направите заявка в изходната колекция за намаляване на картата, като следното:
db.mr_results.find({$and:[{"value.tag":"tag1"},{"value.tag":"tag2"}, {"value.tag":"tag3"}]})