S'il est peu probable que les balises que vous utilisez et leurs slugs respectifs changent, je pense que votre deuxième approche est la meilleure. Cependant, je suggérerais un petit changement - plutôt que de stocker un tableau de [name, slug]
, rendez les champs explicites en créant un sous-document de balise comme dans cet exemple post
documents :
{
"_id" : ObjectId("4ee33229d8854784468cda7e"),
"title" : "My Post",
"content" : "This is a post with some tags",
"tags" : [
{
"name" : "meta",
"slug" : "34589734"
},
{
"name" : "post",
"slug" : "34asd97x"
},
]
}
Vous pouvez ensuite rechercher des publications avec une balise particulière en utilisant la notation par points comme ceci :
db.test.find({ "tags.name" : "meta"})
Parce que les tags
est un tableau, mongo est assez intelligent pour faire correspondre la requête à n'importe quel élément du tableau plutôt qu'au tableau dans son ensemble, et la notation par points vous permet de faire correspondre un champ particulier.
Pour rechercher des publications pas contenant une balise spécifique, utilisez $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
Et pour interroger les publications contenant une balise mais pas l'autre, utilisez $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
J'espère que cela vous aidera !