Jika tag yang Anda gunakan dan siputnya masing-masing tidak mungkin berubah, saya pikir pendekatan kedua Anda adalah yang lebih baik. Namun saya akan menyarankan perubahan kecil - daripada menyimpan array [name, slug]
, buat bidang eksplisit dengan membuat subdokumen tag seperti dalam contoh ini post
dokumen:
{
"_id" : ObjectId("4ee33229d8854784468cda7e"),
"title" : "My Post",
"content" : "This is a post with some tags",
"tags" : [
{
"name" : "meta",
"slug" : "34589734"
},
{
"name" : "post",
"slug" : "34asd97x"
},
]
}
Anda kemudian dapat meminta posting dengan tag tertentu menggunakan notasi titik seperti ini:
db.test.find({ "tags.name" : "meta"})
Karena tags
adalah sebuah array, mongo cukup pintar untuk mencocokkan kueri dengan elemen apa pun dari array daripada array secara keseluruhan, dan notasi titik memungkinkan Anda untuk mencocokkan dengan bidang tertentu.
Untuk menanyakan postingan tidak berisi tag tertentu, gunakan $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
Dan untuk menanyakan postingan yang berisi satu tag tetapi tidak yang lain, gunakan $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Semoga ini bisa membantu!