2013-08-04 14 views
18

Ich versuche, meine Datenbank nach Preisen abzufragen, die größer/kleiner als eine vom Benutzer angegebene Nummer sind. In meinem databse werden die Preise wie so gespeichert:

{price: "300.00"} 

die Dokumentation nach, sollte diese Arbeit:

db.products.find({price: {$gt:30.00}}).pretty() 

Aber ich bekomme keine Ergebnisse zurückgegeben. Ich habe auch versucht {price: {$gt:30}}.

Was fehlt mir hier?

Es ist, weil die Preise als String statt als Zahl in der DB gespeichert sind? Gibt es einen Weg dahin?

Antwort

19

Wenn Sie beabsichtigen, $ gt mit Strings zu verwenden, müssen Sie regex verwenden, was nicht besonders leistungsfähig ist. Es ist einfacher, einfach ein neues Feld zu erstellen, das den Zahlenwert des Preises enthält oder diesen Feldtyp in int/double ändert. Eine JavaScript-Version sollte auch funktionieren, wie folgt:

db.products.find("this.price > 30.00") 

als js wird es in Nummer vor der Verwendung konvertieren. Indizes funktionieren jedoch nicht mit dieser Abfrage.

+0

Woah, hatte keine Ahnung, dass Sie Javascript in der Abfrage verwenden könnten. Super, danke. Ich werde es trotzdem in eine Zahl umwandeln, aber das hilft sehr. – Jascination

+0

Sie möchten, dass ein Preis int nur @Jascination die JS-Ausführung wird keinen Index verwenden, als solche ist es in diesem Fall ziemlich nutzlos, einfacher zu machen Ihr Schema richtig – Sammaye

+2

Bitte vermeiden Sie $ wo, es wird in JavaScript und ausgeführt gibt einen großen Performance-Hit. $ gt kann auch mit anderen Typen verwendet werden. – Derick

14

$gt ist ein Operator, der auf jede Art arbeiten:

db.so.drop(); 
db.so.insert({ name: "Derick" }); 
db.so.insert({ name: "Jayz" }); 
db.so.find({ name: { $gt: "Fred" } }); 

Returns:

{ "_id" : ObjectId("51ffbe6c16473d7b84172d58"), "name" : "Jayz" } 

Wenn Sie mit $gt oder $lt vergleichen möchten gegen eine Reihe, dann wird der Wert in Ihrem Dokument muss auch eine Nummer sein. Typen in MongoDB sind streng und tun nicht automatisch konvertieren wie sie f.e. würde in PHP tun. Um das Problem zu lösen, stellen Sie sicher, dass Sie die Preise als Zahlen (Schwimmern oder Ints) speichern:

db.so.drop(); 
db.so.insert({ price: 50.40 }); 
db.so.insert({ price: 29.99 }); 
db.so.find({ price: { $gt: 30 } }); 

Returns:

{ "_id" : ObjectId("51ffbf2016473d7b84172d5b"), "price" : 50.4 } 
+0

Große Antwort, danke! – Rijk

Verwandte Themen