你如何用Mongoid写“(A或B)和(A或C)”查询?

时间:2010-10-04 17:32:06

标签: ruby mongoid

我需要写一个“A OR B OR(C AND D)”形式的MongoDB查询来返回一些记录。我们使用Mongoid来访问我们的模型。

我将该查询扩展为“(或或B或C)和(或或B或D)”并且希望使用Mongoid的Criteria方法any_of这样:Model.any_of(A, B, C).any_of(A, B, D)将完成我的任务想要,但在发送到数据库之前,它会被扩展为“A OR B或C或A或B或D”。

有没有办法构建这个查询,或者我是否必须构建一个查询来执行A OR B而另一个查询来构建C和D并将它们联合起来?

3 个答案:

答案 0 :(得分:3)

(编辑:我刚注意到这个问题已经有3年了。我不知道它为什么会出现。)

你想要这样的东西:

Model.any_of(a, b, c)

其中abc是选择器文档(记住,它们与多个子句进行AND运算)。

例如,如果您的查询是:

{a: 1}
{b: 1}
{c: 1, d: 1}

然后你会使用:

Model.any_of( {a: 1}, {b: 1}, {c: 1, d: 1} )

这将生成如下查询:

models.find({$or: [{a: 1}, {b: 1}, {c: 1, d: 1}]})

答案 1 :(得分:0)

检查此链接,希望它可以帮助您 -

http://mongoid.org/docs/querying/

如果可能,你可以将“.any_in”和“.and”结合起来并结帐。

答案 2 :(得分:0)

看起来这是mongo中的一个错误,但我很难确定报告/跟踪mongo问题的位置。

> db.things.insert({x : 1, y: 2});
> db.things.insert({x : 2, y: 3});
> db.things.insert({x : 3, y: 4});
> db.things.find( { $or : [{x:1,x:2}], $or : [{y:1,y:2}] });
{ ..., "x" : 1, "y" : 2 }
{ ..., "x" : 2, "y" : 3 }