Om taggarna du använder och deras respektive sniglar sannolikt inte kommer att ändras, tror jag att ditt andra tillvägagångssätt är det bättre. Men jag skulle föreslå en liten ändring - snarare än att lagra en array av [name, slug]
, gör fälten explicita genom att skapa ett taggunderdokument som i det här exemplet post
dokument:
{
"_id" : ObjectId("4ee33229d8854784468cda7e"),
"title" : "My Post",
"content" : "This is a post with some tags",
"tags" : [
{
"name" : "meta",
"slug" : "34589734"
},
{
"name" : "post",
"slug" : "34asd97x"
},
]
}
Du kan sedan fråga efter inlägg med en viss tagg med punktnotation så här:
db.test.find({ "tags.name" : "meta"})
Eftersom tags
är en array, är mongo smart nog att matcha frågan mot valfritt element i arrayen snarare än arrayen som helhet, och dot-notation låter dig matcha mot ett visst fält.
Att fråga efter inlägg inte som innehåller en specifik tagg, använd $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
Och för att fråga efter inlägg som innehåller en tagg men inte den andra, använd $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Hoppas detta hjälper!