2017-08-25 1 views
0

Ich versuchte IndexUngewöhnliche nicht 1 oder -1 Werte für MongoDB Indizes

db.collection_name.createIndex({"field_name":1}) 

Dann mit zu erstellen, wenn ich getIndexes() ich nannte es mich gibt folgende Ergebnisse

{ 
    "v" : 2, 
    "key" : { 
     "field_name" : 1.0 
    }, 
    "name" : "field_name_1", 
    "ns" : "dbname.collection_name" 
} 

So frage ich mich, warum ist es Fließkomma "field_name" : 1.0 jetzt? Ist es schlimm? Sollte ich mir darüber Sorgen machen? Irgendeine Möglichkeit, es genau zu machen 1?

Und aus Neugier: Ich ich habe bemerkt, kann auf diese Weise auch erfolgreich nennen:

db.collection_name.createIndex({"another_field_name":12345}) 

ohne es irgendwelche Fehler zu erzeugen. Ich frage mich, was in diesem Fall passiert.

Antwort

2

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.

Verwandte Themen