Als het onwaarschijnlijk is dat de tags die u gebruikt en hun respectievelijke slugs veranderen, denk ik dat uw tweede benadering de betere is. Ik zou echter een kleine wijziging willen voorstellen - in plaats van een array van [name, slug]
op te slaan , maak de velden expliciet door een tag-subdocument te maken zoals in dit voorbeeld 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"
},
]
}
Je kunt dan zoeken naar berichten met een bepaalde tag met behulp van puntnotatie zoals dit:
db.test.find({ "tags.name" : "meta"})
Omdat tags
is een array, mongo is slim genoeg om de query te vergelijken met elk element van de array in plaats van de array als geheel, en puntnotatie stelt je in staat om te matchen met een bepaald veld.
Vragen naar berichten niet met een specifieke tag, gebruik $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
En om te zoeken naar berichten die de ene tag bevatten, maar niet de andere, gebruik je $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Ik hoop dat dit helpt!