Beachten Sie den Befehl ein paar Zeilen weiter unten in der von Ihnen verlinkten Dokumentation:
Dies sagt Ihnen, dass nicht vorhandene Felder und Felder, die auf null gesetzt sind, besonders behandelt werden.
Um die Dokumente {}
und {a: null}
um in der Sortierreihenfolge äquivalent zu sein, muss der Sortieralgorithmus berücksichtigen, dass das fehlende Sortierfeld vorhanden ist, und einen Wert von null
haben .
Wenn Sie das fehlende Feld explizit hinzufügen, nur um zu sehen, wie es aussieht, ist die Reihenfolge sinnvoller.
Der Filter {tag: { $gte: { baz: MinKey() }}}
angewendet auf {_id: 1, tag: {bar: "BAR"}}
vergleicht im Wesentlichen {baz: MinKey()}
mit {baz: null, bar: "BAR"}
.
Ganz oben in der verlinkten Dokumentation steht, dass MinKey
ist kleiner als null
, das ist also die richtige Reihenfolge.
BEARBEITEN
Im Allgemeinen ist das Abfragen am effizientesten, wenn die Feldnamen selbst keine Daten sind. In Bezug auf eine tabellarische Datenbank, welche Spalte würde „baz“ enthalten?
Eine geringfügige Änderung des Schemas würde diese Art von Abfrage vereinfachen. Statt {tagname: tagvalue}
, verwenden Sie {k:tagname, v:tagvalue}
. Sie könnten dann tag.k
indizieren und/oder tag.v
, und fragen Sie nach tag.k
Um alle Dokumente mit einem "baz"-Tag zu finden, würde die Abfrage von Tags mit Ungleichheitsoperationen intuitiver funktionieren.
db.collection.find({"tag.k":{$gte:"baz"}})
Exakte Übereinstimmungen können mit elemMatch wie
durchgeführt werdendb.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})
Wenn Sie wirklich brauchen, dass die zurückgegebenen Dokumente {tagname: tagvalue}
enthalten , das $arrayToObject
Aggregationsoperator kann das:
db.collection.aggregate([
{$match: {
"tag.k": {$gte: "baz"}
}},
{
$addFields: {
tag: {$arrayToObject: [["$tag"]]}
}}
])