2013-08-04 20 views
18

我想查詢我的數據庫的價格大於/小於用戶指定的數字。在我DATABSE,價格都存儲像這樣:

{price: "300.00"} 

根據該文檔,這應該工作:

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

但我沒有得到任何結果返回。我也試過{price: {$gt:30}}

我在這裏錯過了什麼?

這是因爲價格存儲爲字符串而不是數據庫中的數字?有沒有解決的辦法?

回答

19

如果您打算在字符串中使用$ gt,您將不得不使用正則表達式,這在性能方面並不好。只需創建一個保存價格數值的新字段或將此字段類型更改爲int/double更容易。 JavaScript版本也應該如此工作:

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

由於js會在使用前將其轉換爲數字。但是,索引不適用於此查詢。

+0

哇,不知道,你可以在查詢中使用JavaScript。太好了,謝謝。無論如何,我會將它轉換爲數字,但這會有很大幫助。 – Jascination

+0

你會想要一個價格只是int @Jascination的JS執行將使用沒有索引,因爲它在這種情況下幾乎沒有用,更容易只是使您的架構正確 – Sammaye

+2

請避免$其中,它是運行在JavaScript和給予了很大的性能提升。 $ gt也可以與其他類型一起使用。 – Derick

14

$gt是運營商可以在任何類型的工作:

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

返回:

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

如果你想對一些比較$gt$lt,那麼你的文檔中的值也需要是一個數字。在MongoDB中的類型是嚴格的,並且做不是自動轉換就像他們f.e.將在PHP中完成。爲了解決你的問題,請確保您存儲的價格爲數字(浮點或整數):

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

返回:

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

很好的答案,謝謝! – Rijk