Если теги, которые вы используете, и их соответствующие слагы вряд ли изменятся, я думаю, что ваш второй подход - лучший.Однако я бы предложил небольшое изменение - вместо того, чтобы хранить массив [name, slug]
, сделайте поля явными, создав поддокумент тега, как в этом примере post
document:
{
"_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"}]})
Надеюсь, это поможет!