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