1

这就是我开始查询一个特定元素的方式。

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 命令,在 ruby​​ 中有类似的东西吗?

基本上我想这样做:

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

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

而不仅仅是拥有

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

这种语法是错误的,最好的方法是什么?

4

1 回答 1

4

你想得到这样的结果:

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非空的支票也可能是个好主意。

于 2012-12-09T20:13:49.583 回答