我需要写一个“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并将它们联合起来?
答案 0 :(得分:3)
(编辑:我刚注意到这个问题已经有3年了。我不知道它为什么会出现。)
你想要这样的东西:
Model.any_of(a, b, c)
其中a
,b
和c
是选择器文档(记住,它们与多个子句进行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)
答案 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 }