Se é improvável que as tags que você usa e seus respectivos slugs mudem, acho que sua segunda abordagem é a melhor. No entanto, eu sugeriria uma pequena mudança - em vez de armazenar uma matriz de
[name, slug]
, torne os campos explícitos criando um subdocumento de tag como neste exemplo post
documento:{
"_id" : ObjectId("4ee33229d8854784468cda7e"),
"title" : "My Post",
"content" : "This is a post with some tags",
"tags" : [
{
"name" : "meta",
"slug" : "34589734"
},
{
"name" : "post",
"slug" : "34asd97x"
},
]
}
Você pode consultar postagens com uma tag específica usando notação de ponto assim:
db.test.find({ "tags.name" : "meta"})
Porque
tags
é uma matriz, o mongo é inteligente o suficiente para corresponder a consulta a qualquer elemento da matriz em vez da matriz como um todo, e a notação de ponto permite que você corresponda a um campo específico. Para consultar postagens não contendo uma tag específica, use
$ne
:db.test.find({ "tags.name" : { $ne : "fish" }})
E para consultar posts contendo uma tag mas não a outra, use
$and
:db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Espero que isto ajude!