Bemærk kommandoen et par linjer nede i den dokumentation, du linkede til:
Dette fortæller dig, at ikke-eksisterende felter og felter sat til null behandles specielt.
For at få dokumenterne {} og {a: null} for at være ækvivalent i sorteringsrækkefølge, skal sorteringsalgoritmen overveje, at det manglende sorteringsfelt er til stede og have en værdi på null .
Hvis du udtrykkeligt tilføjer det manglende felt, bare for at se, hvordan det ser ud, giver rækkefølgen mere mening.
Filteret {tag: { $gte: { baz: MinKey() }}} anvendt på {_id: 1, tag: {bar: "BAR"}} sammenligner i det væsentlige {baz: MinKey()} med {baz: null, bar: "BAR"} .
Nær toppen af den dokumentation, du linkede, står der, at MinKey er mindre end null , så det er den rigtige rækkefølge.
REDIGER
Generelt er forespørgsel mest effektivt, når feltnavnene ikke i sig selv er data. Med hensyn til en tabelbaseret database, hvilken kolonne ville indeholde "baz"?
En lille ændring i skemaet ville forenkle denne type forespørgsel. I stedet for {tagname: tagvalue} , brug {k:tagname, v:tagvalue} . Du kan derefter indeksere tag.k og/eller tag.v , og forespørg på tag.k for at finde alle dokumenter med et "baz"-tag, ville forespørgsler på tags med ulighedsoperationer fungere mere intuitivt.
db.collection.find({"tag.k":{$gte:"baz"}})
Præcise matches kunne udføres med elemMatch like
db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})
Hvis du virkelig har brug for, at de returnerede dokumenter indeholder {tagname: tagvalue} , $arrayToObject aggregeringsoperatør kan gøre det:
db.collection.aggregate([
{$match: {
"tag.k": {$gte: "baz"}
}},
{
$addFields: {
tag: {$arrayToObject: [["$tag"]]}
}}
])