Noteer de opdracht een paar regels verderop in de documentatie die je hebt gelinkt:
Dit geeft aan dat niet-bestaande velden en velden die op null zijn ingesteld speciaal worden behandeld.
Om de documenten {}
en {a: null}
om equivalent te zijn in sorteervolgorde, moet het sorteeralgoritme rekening houden met het ontbrekende sorteerveld om aanwezig te zijn, en een waarde hebben van null
.
Als je het ontbrekende veld expliciet toevoegt, gewoon om te zien hoe het eruit ziet, is de volgorde logischer.
Het filter {tag: { $gte: { baz: MinKey() }}}
toegepast op {_id: 1, tag: {bar: "BAR"}}
vergelijkt in wezen {baz: MinKey()}
met {baz: null, bar: "BAR"}
.
Bovenaan de documentatie die je hebt gelinkt, staat dat MinKey
is kleiner dan null
, dus dat is de juiste volgorde.
BEWERKEN
Over het algemeen is query's het meest efficiënt wanneer de veldnamen zelf geen gegevens zijn. In termen van een database in tabelvorm, welke kolom zou "baz" bevatten?
Een kleine wijziging in het schema zou dit type query vereenvoudigen. In plaats van {tagname: tagvalue}
, gebruik {k:tagname, v:tagvalue}
. U kunt dan tag.k
index indexeren en/of tag.v
, en zoek op tag.k
om alle documenten met een "baz"-tag te vinden, zou het opvragen van tags met ongelijkheidsbewerkingen intuïtiever werken.
db.collection.find({"tag.k":{$gte:"baz"}})
Exacte overeenkomsten kunnen worden gedaan met elemMatch zoals
db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})
Als u echt wilt dat de geretourneerde documenten {tagname: tagvalue}
. bevatten , de $arrayToObject
aggregatie-operator kan dat doen:
db.collection.aggregate([
{$match: {
"tag.k": {$gte: "baz"}
}},
{
$addFields: {
tag: {$arrayToObject: [["$tag"]]}
}}
])