2014-01-22 3 views
9

Ich möchte ein einzelnes Dokument in eine Variable in der Mongo JS-Shell speichern und das Dokument (lesen/schreiben mehrere Attribute) für letztere Operationen, aber Mongo JS scheint nichts in die Variable zu setzen:Wie wird das Abfrageergebnis (ein einzelnes Dokument) in eine Variable gespeichert?

> a = db.col.find().limit(1) 
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } 
> a 
> 

Unterstützt mongo die Verwendung? Oder war da ein Fehler?

Antwort

20

Sie müssen var verwenden wie so:

> var a = db.col.find().limit(1) 
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } 
> a 
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } 

einige Tests tun habe ich bemerkt, dass die find() Methode die Variable auf einen Cursor zu sein scheint Einstellung. In diesen Fällen verlieren Sie die Variable nach der nächsten Anweisung.

> var a = db.col.find().limit(1) 
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } 
> var b = 'test' 
> a 
> 

Wenn Sie die Variable um länger halten müssen, versuchen Sie explizit die Variable iteriert, bevor es mit toArray() Einstellung.

> var a = db.col.find().limit(1).toArray() 
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } 
> var b = 'test' 
> a 
[ 
    { 
    "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), 
    "a" : 16807, 
    "b" : 475249 
    } 
] 
10

find gibt einen Cursor zurück. Ein Cursor kann nur einmal aufgelistet werden. Sobald Sie einen Cursor aufgezählt haben, hat er das Ende erreicht und liefert keine weiteren Dokumente mehr. Im folgenden Beispiel wird der Variablen a ein Cursor-Wert zugewiesen, und wenn wir zum ersten Mal "a" in der Shell auswerten, werden die Ergebnisse der Aufzählung des Cursors wiedergegeben. Das zweite Mal, dass wir evalute „a“ es aufzählt die Cursor wieder, aber dieses Mal, wenn der Cursor ist leer, so werden keine Dokumente hallen:

> var a = db.test.find().limit(1) 
> a 
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } 
> a 
> 

Das obige Beispiel gibt einen Cursor, obwohl Sie Limit (1) verwendet. Es ist nicht so, dass "a" seinen Wert verliert, es bezieht sich immer noch auf den gleichen Cursor, es ist nur so, dass der Cursor, auf den es sich bezieht, sein Ende erreicht hat.

Wenn Sie ein einzelnes Dokument zu lesen und den Rückgabewert haben, ein Dokument anstelle eines Cursors Verwendung FindOne:

> var a = db.test.findOne() 
> a 
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } 
> a 
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } 
> 
+0

Dies ist eine einfachere Antwort als die von bpruitt-goddard. Wenn Sie nur nach einem einzelnen Dokument suchen, funktioniert das so, wie Sie es erwarten würden. – JackAce

+0

Danke für die Erklärung, ich habe mich gefragt, warum meine Variable nur den Wert beim ersten Mal gehalten hat, aber die Cursor-Erklärung macht absolut Sinn. –

2

Wenn Sie nur ein Element und wollen die „verlieren die Variable“ vermeiden Problem in anderen Antworten beschrieben Sie findOne() statt find() verwenden:

> var doc = db.col.findOne() 

der doc Variablensatz auf diese Weise wird permanent.

Verwandte Themen