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"]]}
}}
])