Vì MongoDB không có khái niệm về phép nối, bạn cần giải quyết vấn đề này bằng cách giảm đầu vào của mình thành một tài liệu duy nhất.
Nếu bạn thay đổi cấu trúc tài liệu của mình để bạn đang lưu trữ một mảng thẻ, như sau:
{id: 123, tag:["tag1","tag2","tag3"]}
{id: 456, tag:["tag1"]}
Bạn có thể thực hiện một truy vấn như sau:
db.user.find({$and:[{tag:"tag1"},{tag:"tag2"},{tag:"tag3"}]})
Nếu cần, bạn có thể viết map-Reduce để tạo ra một mảng thẻ cho một userid, vì vậy bạn có thể thực hiện truy vấn trên trên đó.
Chỉnh sửa - Bao gồm thu nhỏ bản đồ đơn giản
Đây là một thao tác rút gọn bản đồ thực sự đơn giản để đưa dữ liệu đầu vào ban đầu thành một định dạng hữu ích cho find
truy vấn đưa ra ở trên.
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"})
Sau đó, bạn có thể truy vấn trên tập hợp đầu ra thu gọn bản đồ, như sau:
db.mr_results.find({$and:[{"value.tag":"tag1"},{"value.tag":"tag2"}, {"value.tag":"tag3"}]})