I když se zdá, že jste se k této struktuře přiblížili kvůli problému s aktualizacemi při používání vnořených polí, ve skutečnosti jste způsobili další problém tím, že jste udělali něco jiného, co ve skutečnosti není podporováno, a to, že neexistuje žádný "zástupný znak" koncept pro vyhledávání nespecifikovaných klíčů pomocí standardních dotazovacích operátorů, které jsou optimální.
Jediný způsob, jak můžete skutečně vyhledat taková data, je pomocí kódu JavaScript na serveru procházet klíče pomocí $where
. To zjevně není opravdu dobrý nápad, protože to vyžaduje hrubou sílu spíše než používat užitečné věci, jako je index, ale lze k němu přistupovat následovně:
db.theses.find(function() {
var relations = this.relations;
return Object.keys(relations).some(function(rel) {
return relations[rel].type == "interpretation";
});
))
I když to vrátí ty objekty z kolekce, které obsahují požadovanou vnořenou hodnotu, musí zkontrolovat každý objekt v kolekci, aby bylo možné provést vyhodnocení. To je důvod, proč by se takové vyhodnocení mělo skutečně používat pouze ve spojení s něčím, co může místo toho přímo používat index jako pevnou hodnotu z objektu v kolekci.
Stále lepším řešením je zvážit přemodelování dat, aby bylo možné využít indexy ve vyhledávání. Tam, kde je nutné aktualizovat informace o "hodnocení", pak v podstatě "zploštit" struktura, která místo toho považuje každý prvek „hodnocení“ za jediná data pole:
{
"_id": "aeokejXMwGKvWzF5L",
"text": "test",
"relationsRatings": [
{
"relationId": "cF6iKAkDJg5eQGsgb",
"type": "interpretation",
"originId": "uFEjssN2RgcrgiTjh",
"ratingId": 1,
"ratingScore": 5
},
{
"relationId": "cF6iKAkDJg5eQGsgb",
"type": "interpretation",
"originId": "uFEjssN2RgcrgiTjh",
"ratingId": 2,
"ratingScore": 6
}
]
}
Nyní je hledání samozřejmě docela jednoduché:
db.theses.find({ "relationsRatings.type": "interpretation" })
A samozřejmě poziční $
operátor lze nyní použít s plošší strukturou:
db.theses.update(
{ "relationsRatings.ratingId": 1 },
{ "$set": { "relationsRatings.$.ratingScore": 7 } }
)
Samozřejmě to znamená duplikaci „souvisejících“ dat pro každou hodnotu „hodnocení“, ale to jsou obecně náklady na aktualizaci podle odpovídající pozice, protože to je vše, co je podporováno pouze jedinou úrovní vnoření pole.
Takže můžete přinutit logiku, aby odpovídala tomu, jak ji máte strukturovanou, ale není to dobrý nápad a povede to k problémům s výkonem. Pokud je však vaší hlavní potřebou aktualizovat informace o „hodnocení“ spíše než je pouze přidávat do vnitřního seznamu, pak bude větší přínos plošší struktura a samozřejmě bude mnohem rychlejší pro vyhledávání.