Ако маркерите, които използвате, и съответните им охлюви е малко вероятно да се променят, мисля, че вашият втори подход е по-добрият. Въпреки това бих предложил малка промяна - вместо съхраняване на масив от [name, slug]
, направете полетата изрични, като създадете поддокумент на етикет, както в този пример post
документ:
{
"_id" : ObjectId("4ee33229d8854784468cda7e"),
"title" : "My Post",
"content" : "This is a post with some tags",
"tags" : [
{
"name" : "meta",
"slug" : "34589734"
},
{
"name" : "post",
"slug" : "34asd97x"
},
]
}
След това можете да търсите публикации с конкретен етикет, като използвате точкова нотация като това:
db.test.find({ "tags.name" : "meta"})
Тъй като tags
е масив, mongo е достатъчно умен, за да съпостави заявката с всеки елемент от масива, а не с масива като цяло, а точковата нотация ви позволява да съпоставите с определено поле.
За заявка за публикации не съдържащ конкретен таг, използвайте $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
И за да търсите публикации, съдържащи един таг, но не и другия, използвайте $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Надявам се това да помогне!