Nếu các thẻ bạn sử dụng và các slug tương ứng của chúng không có khả năng thay đổi, tôi nghĩ cách tiếp cận thứ hai của bạn là cách tốt hơn. Tuy nhiên, tôi sẽ đề xuất một thay đổi nhỏ - thay vì lưu trữ một mảng [name, slug]
, hãy làm cho các trường rõ ràng bằng cách tạo tài liệu con thẻ như trong ví dụ này post
tài liệu:
{
"_id" : ObjectId("4ee33229d8854784468cda7e"),
"title" : "My Post",
"content" : "This is a post with some tags",
"tags" : [
{
"name" : "meta",
"slug" : "34589734"
},
{
"name" : "post",
"slug" : "34asd97x"
},
]
}
Sau đó, bạn có thể truy vấn các bài đăng có một thẻ cụ thể bằng cách sử dụng ký hiệu dấu chấm như thế này:
db.test.find({ "tags.name" : "meta"})
Vì thẻ tags
là một mảng, mongo đủ thông minh để so khớp truy vấn với bất kỳ phần tử nào của mảng thay vì toàn bộ mảng và ký hiệu dấu chấm cho phép bạn so khớp với một trường cụ thể.
Để truy vấn các bài đăng không chứa một thẻ cụ thể, hãy sử dụng $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
Và để truy vấn các bài đăng có chứa một thẻ nhưng không chứa thẻ kia, hãy sử dụng $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Hy vọng điều này sẽ hữu ích!