2013-08-04 26 views
18

Tôi đang cố truy vấn cơ sở dữ liệu của mình với giá lớn hơn/ít hơn số người dùng được chỉ định. Trong databse của tôi, giá cả được lưu trữ như vậy:

{price: "300.00"} 

Theo các tài liệu, điều này sẽ làm việc:

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

Nhưng tôi không nhận được kết quả trả về. Tôi cũng đã thử {price: {$gt:30}}.

tôi thiếu gì ở đây?

Có phải vì giá được lưu dưới dạng chuỗi chứ không phải số trong DB? Có cách nào để giái quyết vấn đề này không?

Trả lời

19

Nếu bạn dự định sử dụng $ gt với chuỗi, bạn sẽ phải sử dụng regex, điều này không tuyệt vời về hiệu suất. Sẽ dễ dàng hơn khi tạo một trường mới chứa giá trị số của giá hoặc thay đổi kiểu trường này thành int/double. Phiên bản javascript cũng sẽ hoạt động, như vậy:

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

vì js sẽ chuyển đổi thành số trước khi sử dụng. Tuy nhiên, các chỉ mục sẽ không hoạt động trên truy vấn này.

+0

Woah, không biết bạn có thể sử dụng javascript trong truy vấn. Thật sự cảm ơn. Tôi sẽ chuyển đổi nó thành một số dù sao nhưng điều này giúp ích rất nhiều. – Jascination

+0

Bạn sẽ muốn một mức giá chỉ int @Jascination việc thực hiện JS sẽ không sử dụng chỉ mục, vì vậy nó là khá nhiều vô dụng trong trường hợp này, dễ dàng hơn để chỉ làm cho lược đồ của bạn đúng – Sammaye

+2

Hãy tránh $ ở đâu, nó được chạy trong JavaScript và mang lại hiệu suất lớn. $ gt cũng có thể được sử dụng với các loại khác. – Derick

14

$gt là một nhà điều hành có thể làm việc trên bất kỳ loại:

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" } 

Nếu bạn muốn so sánh với một số với $gt hoặc $lt, thì giá trị trong tài liệu của bạn cũng cần phải là một số. Các loại trong MongoDB là nghiêm ngặt và làm không tự động chuyển đổi như chúng f.e. sẽ làm trong PHP. Để giải quyết vấn đề của bạn, hãy chắc chắn bạn lưu trữ các giá như số (phao hoặc ints):

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

Câu trả lời hay, cảm ơn! – Rijk

Các vấn đề liên quan