2012-12-09 15 views
1

這是我如何去查詢一個特定的元素。使用rails構建Mongo查詢?怎麼樣?

results << read_db.collection("users").find(:created_at => {:$gt => initial_date}).to_a 

現在,我試圖通過多個查詢。

db.inventory.find({ $and: [ { price: 1.99 }, { qty: { $lt: 20 } }, { sale: true } ] }) 

現在如何建立我的查詢?基本上我會有一堆if語句,如果是真的,我想擴展我的查詢。我聽說有另一種語言的.extend命令,有沒有類似的紅寶石?

基本上我想這樣做:

if price 
query = "{ price: 1.99 }" 
end 

if qty 
query = query + "{ qty: { $lt: 20 } }" 
end 

,並不僅僅是有

db.inventory.find({ $and: [query]}) 

這句法是錯的,什麼是去這樣做的最佳方式?

回答

3

您是否希望這樣的事情結束了:

db.inventory.find({ :$and => some_array_of_mongodb_queries}) 

請注意,我已經切換到hashrocket語法,你不能說都沒有標識符號使用JavaScript符號。 :$and的值應該是一個單獨查詢的數組,而不是一個字符串數組;所以你應該建立一個數組:

parts = [ ] 
parts.push(:price => 1.99)   if(price) 
query.push(:qty => { :$lt => 20 }) if(qty) 
#... 
db.inventory.find(:$and => parts) 

順便說一句,你可能會:price => 1.99碰到一些浮點的問題,您應該使用針對工作中的一個整數美分,而不是美元。某種檢查parts不爲空可能是一個好主意。

+0

太棒了!謝謝! – coldRespect

+0

快速問題。我如何推送空的查詢? $,不能只有一個或沒有條目 – coldRespect

+0

如果'parts.empty?'那麼你沒有什麼可以搜索的,如果'parts.size == 1'那麼你可以跳過':$和'並使用'parts .first'直接:'db.inventory.find(parts.first)' –