Hvis det er usandsynligt, at de tags, du bruger, og deres respektive slugs vil ændre sig, tror jeg, at din anden tilgang er den bedre. Jeg vil dog foreslå en lille ændring - i stedet for at gemme et array af [name, slug]
, gør felterne eksplicitte ved at oprette et tag-underdokument som i dette eksempel 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 derefter forespørge efter indlæg med et bestemt tag ved hjælp af punktnotation sådan her:
db.test.find({ "tags.name" : "meta"})
Fordi tags
er et array, er mongo klog nok til at matche forespørgslen mod ethvert element i arrayet i stedet for arrayet som helhed, og dot-notation giver dig mulighed for at matche mod et bestemt felt.
For at forespørge efter indlæg ikke der indeholder et specifikt tag, skal du bruge $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
Og for at søge efter indlæg, der indeholder det ene tag, men ikke det andet, skal du bruge $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Håber dette hjælper!