Poznamenejte si příkaz o pár řádků níže v dokumentaci, kterou jste propojili:
To vám říká, že neexistující pole a pole nastavená na hodnotu null jsou ošetřena speciálně.
V pořadí dokumentů {} a {a: null} aby bylo v pořadí řazení ekvivalentní, musí třídicí algoritmus považovat chybějící třídicí pole za přítomné a musí mít hodnotu null .
Pokud explicitně přidáte chybějící pole, abyste viděli, jak vypadá, dává řazení větší smysl.
Filtr {tag: { $gte: { baz: MinKey() }}} použito na {_id: 1, tag: {bar: "BAR"}} v podstatě porovnává {baz: MinKey()} s {baz: null, bar: "BAR"} .
V horní části propojené dokumentace je uvedeno, že MinKey je menší než null , takže to je správné řazení.
UPRAVIT
Obecně je dotazování nejúčinnější, když názvy polí nejsou samy o sobě daty. Pokud jde o tabulkovou databázi, který sloupec by obsahoval „baz“?
Drobná změna schématu by tento typ dotazu zjednodušila. Místo {tagname: tagvalue} , použijte {k:tagname, v:tagvalue} . Poté můžete indexovat tag.k a/nebo tag.v a zadejte dotaz na tag.k Chcete-li najít všechny dokumenty se značkou "baz", dotazování značek s operacemi nerovnosti by fungovalo intuitivněji.
db.collection.find({"tag.k":{$gte:"baz"}})
Přesné shody lze provést pomocí elemMatch jako
db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})
Pokud opravdu potřebujete, aby vrácené dokumenty obsahovaly {tagname: tagvalue} , $arrayToObject agregační operátor to může udělat:
db.collection.aggregate([
{$match: {
"tag.k": {$gte: "baz"}
}},
{
$addFields: {
tag: {$arrayToObject: [["$tag"]]}
}}
])