Ihre Frage ist eigentlich ein paar Fragen, aber die erste hat eine kurze Antwort
Q: „Warum bin ich eine Floating-Point bekommen“
A: Weil Sie robomongo verwenden, und die Schnittstelle zeigt einfach die mitgelieferte Number
Art auf diese Weise. Die mongo
Schale zeigt tatsächlich diese anders
Und die zweite:
Q:„Warum ich 12345
als Wert verwenden können, anstatt nur 1
oder -1
“
A: Weil es immer noch tatsächlich numerisch und gültig ist. Alles, was MongoDB hier interessiert, ist "positiv" oder "negativ". Wo "positiv" eine Abfrage ausgibt, die den Index verwendet, würde standardmäßig "aufsteigend" sortieren. Aber Sie müssten immer noch 1
oder -1
an eine spezifische .sort()
liefern, da das alles wäre, was gültig wäre.
den letzteren Fall zu demonstrieren, einige Daten in Ihre Sammlung einfügen:
db.collection_name.insertMany(
[5,1,3].map(v => ({ another_field_name: v }))
)
Und Ihren Index erstellen:
db.collection_name.createIndex({ "another_field_name": 12345 })
Wenn Sie einen Bereich Abfrage ausführen, wird die „aufsteigende“ verwendet durch den "positiven" Wert:
db.collection_name.find({ "another_field_name": { "$gt": 0 } },{ "_id": 0 })
{ "another_field_name" : 1.0 }
{ "another_field_name" : 3.0 }
{ "another_field_name" : 5.0 }
Dies zeigt die Reihenfolge der Index angewendet wird e Obwohl die tatsächliche Einfügung von Werten in einer anderen Reihenfolge war. Daher wird der Index hier klar angewendet.
Wenn Sie versucht haben, explizit .sort()
mit einem anderen Wert als 1
oder -1
auf diese Art von Index, dann würde das einen Fehler erzeugen. Aber natürlich würde dies zu einer "aufsteigenden" oder "absteigenden" Sortierung führen, da MongoDB die Reihenfolge der Traversierung für den Index gerne umkehrt.
Wenn Sie den Index entfernt und erstellt man einen „negativen“ Wert mit:
db.collection_name.dropIndexes();
db.collection_name.createIndex({ "another_field_name": -54321 });
und gaben dann die gleiche Abfrage:
db.collection_name.find({ "another_field_name": { "$gt": 0 } },{ "_id": 0 })
{ "another_field_name" : 5.0 }
{ "another_field_name" : 3.0 }
{ "another_field_name" : 1.0 }
Dann wird die „absteigend“ Ordnung, weil das angewandt wird, ist im Wesentlichen das, was Sie im Standard-Handling gesagt haben.
Ist das insgesamt gut oder schlecht? Aus der Sicht des Speichers spielt es keine Rolle, denn unabhängig vom tatsächlichen Wert ist ein BSON Double immer noch ein BSON Double.
Sie abwechselnd NumberInt
für einen bestimmten 32-Bit-Wert im Gegensatz zu einem 64-Bit-Wert in BSON Types, aber auch hier der Wert ist, wie angegeben 1
oder 65,000
oder in umgekehrter als -1
oder -65,000
ändert sich nicht die zugewiesene verwenden könnte Lagerung oder die grundlegende Handhabung von, wo es "positiv" oder "negativ" ist.
Für allgemeine Lesbarkeit und Konsistenz mit Argumenten zu .sort()
dann als "Meinung", mit 1
und -1
wird konsequenter für den beabsichtigten Zweck verstanden.
Es ist eigentlich die „bevorzugte“ Implementierung in Bezug auf die Spezifikation und ist etwas echoed in the documentation (wenn auch nicht zu prominent):
Einige Treiber Indizes angeben können, unter Verwendung von NumberLong (1) eher als 1 als die Spezifikation. Dies hat keine Auswirkungen auf den resultierenden Index.