Všechno na tom je docela hrozné, nemůžete indexovat něco jako hodnoty "name" a vaše "cesta" ke každému atributu se bude všude lišit. Takže to je opravdu špatné pro dotazy.
Všiml jsem si, že se zmiňujete o „vnořených“ strukturách a stále byste tomu mohli vyhovět podobným návrhem a nějakým dalším značením, ale chci, abyste zvážili tento příklad typu „telefonní seznam“:
{
"phones": [
{
"type": "Home",
"name" : "Jeff",
"phone" : "123-123-1234"
},
{
"type": "Work",
"name" : "Jeff",
"phone" : "123-123-1234"
},
]
}
Protože se ve skutečnosti jedná o dílčí dokumenty v rámci pole, pole jako "name" vždy sdílejí stejnou cestu, takže je nejen můžete indexovat (což bude dobré pro výkon), ale dotaz je velmi jednoduchý:
db.collection({ "phones.name": "Jeff" })
To dělá přesně to, co potřebujete, když v libovolném záznamu "jméno" najdete "Jeff". Pokud potřebujete hierarchii, přidejte do těchto dílčích dokumentů některá pole, abyste označili vztah rodič/dítě, který můžete použít při následném zpracování. Nebo dokonce jako zhmotněnou cestu, která by mohla pomoci vašim dotazům.
Je to skutečně lepší přístup.
Pokud opravdu musíte zachovat tento druh struktury, udělejte alespoň něco takového s JavaScriptem, který vám pomůže zachránit první zápas do hloubky:
db.collection.find(
function () {
var found = false;
var finder = function( obj, field, value ) {
if ( obj.hasOwnProperty(field) && obj[field] == value )
found = true;
if (found) return true;
for( var n in obj ) {
if ( Object.prototype.toString.call(obj[n]) === "[object Object]" ) {
finder( obj[n], field, value );
if (found) return true;
}
}
};
finder( this, "name", "Jeff" );
return found;
}
)
Formát je zkrácený zápis pro $where
operátor, což je docela špatná zpráva pro výkon, ale vaše struktura nenabízí mnoho jiných možností. V každém případě by se funkce měla opakovat v každém vnořeném dokumentu, dokud nebude nalezeno "pole" s "hodnotou".
U čehokoli v produkčním měřítku se opravdu podívejte na změnu struktury na něco, co lze indexovat a rychle přistupovat. První příklad by vám měl poskytnout výchozí bod. Spoléhat se na libovolný JavaScript pro dotazy, protože vás k tomu omezuje vaše současná struktura, je špatná zpráva.