Se è improbabile che i tag che usi e i rispettivi slug cambino, penso che il tuo secondo approccio sia il migliore. Tuttavia suggerirei una piccola modifica, piuttosto che memorizzare un array di [name, slug]
, rendere espliciti i campi creando un documento secondario tag come in questo esempio 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"
},
]
}
Puoi quindi cercare i post con un tag particolare usando la notazione punto così:
db.test.find({ "tags.name" : "meta"})
Perché tags
è un array, mongo è abbastanza intelligente da abbinare la query a qualsiasi elemento dell'array piuttosto che all'array nel suo insieme e la notazione a punti consente di confrontare un campo particolare.
Per interrogare i post non contenente un tag specifico, usa $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
E per cercare post contenenti un tag ma non l'altro, usa $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Spero che questo aiuti!