我想查詢我的數據庫的價格大於/小於用戶指定的數字。在我DATABSE,價格都存儲像這樣:
{price: "300.00"}
根據該文檔,這應該工作:
db.products.find({price: {$gt:30.00}}).pretty()
但我沒有得到任何結果返回。我也試過{price: {$gt:30}}
。
我在這裏錯過了什麼?
這是因爲價格存儲爲字符串而不是數據庫中的數字?有沒有解決的辦法?
我想查詢我的數據庫的價格大於/小於用戶指定的數字。在我DATABSE,價格都存儲像這樣:
{price: "300.00"}
根據該文檔,這應該工作:
db.products.find({price: {$gt:30.00}}).pretty()
但我沒有得到任何結果返回。我也試過{price: {$gt:30}}
。
我在這裏錯過了什麼?
這是因爲價格存儲爲字符串而不是數據庫中的數字?有沒有解決的辦法?
如果您打算在字符串中使用$ gt,您將不得不使用正則表達式,這在性能方面並不好。只需創建一個保存價格數值的新字段或將此字段類型更改爲int/double更容易。 JavaScript版本也應該如此工作:
db.products.find("this.price > 30.00")
由於js會在使用前將其轉換爲數字。但是,索引不適用於此查詢。
$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 }
很好的答案,謝謝! – Rijk
另外,您可以將這些值轉換爲INT,按: http://www.quora.com/How-can-I-change-a-field-type-from-String-to-Integer-in-mongodb
var convert = function(document){
var intValue = parseInt(document.field, 10);
db.collection.update(
{_id:document._id},
{$set: {field: intValue}}
);
}
db.collection.find({field: {$type:2}},{field:1}).forEach(convert)
哇,不知道,你可以在查詢中使用JavaScript。太好了,謝謝。無論如何,我會將它轉換爲數字,但這會有很大幫助。 – Jascination
你會想要一個價格只是int @Jascination的JS執行將使用沒有索引,因爲它在這種情況下幾乎沒有用,更容易只是使您的架構正確 – Sammaye
請避免$其中,它是運行在JavaScript和給予了很大的性能提升。 $ gt也可以與其他類型一起使用。 – Derick