2013-08-29 2 views
15

Die MongoDB documentation Zustände:Wie können Sie die Reihenfolge der Eigenschaften in einem Javascript-Objekt für einen MongoDB-Index in node.js angeben?

Bei Indizes mit mehr als einem Schlüssel (das heißt Verbindung Indizes) die Reihenfolge der Felder ist wichtig.

Aber ECMAScript definiert ein Objekt wie folgt:

Ein Objekt ist ein Mitglied des Typs Object. Es ist eine ungeordnete Sammlung von Eigenschaften, von denen jede einen primitiven Wert, ein Objekt oder eine Funktion enthält.

Wenn (unter Verwendung this module zum Beispiel) MongoDB in node.js verwendet, sind Sie Server-Seite mit Javascript, wie das Beispiel unten.

Wie geben Sie eine Sequenz an, wenn MongoDB eine object (AKA ungeordnete Sammlung von Eigenschaften) erwartet?

collection.ensureIndex({ 
    date : -1, 
    client : 1, 
    product : 1 
}); 
+0

Ich würde mir keine Sorgen über die "ungeordnete" Eigenschaft von JavaScript machen, weil sie ihre eigene Version von js für die Shell implementiert haben. Probieren Sie 'show dbs' und Sie werden sehen, was ich meine. –

+0

Entschuldigung, ich habe vergessen, Node.js (Javascript) als Skriptsprache zu erwähnen. – Redsandro

+1

Die Eigenschaften sind möglicherweise in der Praxis nicht unbedingt so ungeordnet, wie die ECMA-Spezifikation vorgibt, dass sie * sein dürfen * (http://jsfiddle.net/D4zC8/2/). In Chrome und IE 10 ist die Reihenfolge dort konsistent. Es würde mich nicht zu sehr überraschen, wenn sich ein neues Objekt-Literal in allen wichtigen Implementierungen so verhalten würde. Es scheint ziemlich verrückt zu sein, Code zu veröffentlichen, der sich auf dieses Verhalten stützt. Wenn ich in Chrome eine Eigenschaft lösche und sie ersetze, ändert sich die Reihenfolge der Schlüssel. In IE10 ist es nicht. –

Antwort

9

In MongoDB, die Reihenfolge der Felder in einem Dokument ist in der Tat erheblich, und alle Sprachtreiber ein Mittel Dokumente angeben, die Art und Weise, auch wenn die zugrunde liegende Programmiersprache nicht ein solches Konzept hat.

Das Dokumentformat, das MongoDB in seiner Shell verwendet, ist JSON-artiger aber nicht strenger JSON. Unter anderem wird die Reihenfolge der Felder immer beibehalten.

In JavaScript definiert der Standard Felder als ungeordnet, sodass Implementierungen die Reihenfolge ignorieren/nicht beibehalten können. Aber in der Praxis behalten alle Implementierungen die Reihenfolge. Insbesondere die V8 engine bewahrt die Bestellung, die die Engine in node.js verwendet wird, so ist es kein Problem.

+0

Ich habe vergessen zu erwähnen, dass es darum geht, 'MongoDB' in' Node.js' zu verwenden, welches serverseitiges Javascript ist. Meine Sorgen sind also nicht, wie Mongo intern damit umgeht, sondern der Javascript-Teil. – Redsandro

+3

Die V8-Engine behält tatsächlich die Reihenfolge bei, obwohl sie im Standard als ungeordnet definiert ist. Dies ist eine Grauzone, die derzeit anscheinend ausreichend gut behandelt wird (da alle Umgebungen im Wesentlichen die Reihenfolge beibehalten), aber in Zukunft möglicherweise genauer betrachtet werden müssen. – drmirror

+0

Einige Tests zeigen, dass V8 tatsächlich diese Reihenfolge ständig beibehält. Du solltest deinen Kommentar in deine Antwort schreiben und ich werde ihn akzeptieren. – Redsandro