Jeśli tagi, których używasz i odpowiadające im ślimaki, raczej się nie zmienią, myślę, że twoje drugie podejście jest lepsze. Sugerowałbym jednak małą zmianę - zamiast przechowywać tablicę [name, slug]
, określ pola jawnie, tworząc poddokument tagu, jak w tym przykładzie 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"
},
]
}
Następnie możesz wyszukiwać posty z określonym tagiem za pomocą notacji z kropkami tak:
db.test.find({ "tags.name" : "meta"})
Ponieważ tags
jest tablicą, mongo jest wystarczająco sprytny, aby dopasować zapytanie do dowolnego elementu tablicy, a nie do tablicy jako całości, a notacja z kropkami pozwala na dopasowanie do określonego pola.
Zapytanie o posty nie zawierające określony tag, użyj $ne
:
db.test.find({ "tags.name" : { $ne : "fish" }})
Aby wyszukiwać posty zawierające jeden tag, ale nie drugi, użyj $and
:
db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]})
Mam nadzieję, że to pomoże!