在MongoDB中,如果我想表达A AND(B OR C),我可以很容易地做到:
db.demo.find( { a: 1, $or: [ {b:1}, {c:1} ] });
但如果我想要(A和B)或C - 它似乎不起作用。如果我尝试:
db.demo.find( { $or: [ {a:1,b:1}, {c:1} ] });
以上将其视为A或B或C,与
相同db.demo.find( { $or: [ {a:1}, {b:1}, {c:1} ] });
此时此刻,我不想使用Javascript表达式$ where来完成此任务(但是如果没有其他工作则没有选择) - 原因是,我正在创建一般的过滤规则,这是正在直接转换为MongoDB查询。
任何帮助?
答案 0 :(得分:1)
查询实际上完全正常。问题不正确。
以下是我尝试过的内容以及它的工作方式!
数据:
> db.demo.find()
{ "_id" : 1, "age" : 38, "mgmt" : "no", "salary" : 100 }
{ "_id" : 2, "age" : 45, "salary" : 200, "mgmt" : "no" }
{ "_id" : 3, "age" : 50, "salary" : 250, "mgmt" : "no" }
{ "_id" : 4, "age" : 51, "salary" : 75, "mgmt" : "yes" }
{ "_id" : 5, "age" : 45, "salary" : 75, "mgmt" : "no" }
查询获取(年龄> 40和工资> 200)或mgmt ='是'
> db.demo.find( { $or: [ { age: {$gt:40}, salary:{$gt:200} }, {mgmt: 'yes'} ] })
{ "_id" : 3, "age" : 50, "salary" : 250, "mgmt" : "no" }
{ "_id" : 4, "age" : 51, "salary" : 75, "mgmt" : "yes" }
查询获取(年龄> 40)或(薪水> 200)或mgmt ='是'
> db.demo.find( { $or: [ { age: {$gt:40}}, {salary:{$gt:201} }, {mgmt: 'yes'} ] })
{ "_id" : 2, "age" : 45, "salary" : 200, "mgmt" : "no" }
{ "_id" : 3, "age" : 50, "salary" : 250, "mgmt" : "no" }
{ "_id" : 4, "age" : 51, "salary" : 75, "mgmt" : "yes" }
{ "_id" : 5, "age" : 45, "salary" : 75, "mgmt" : "no" }
所有这些都应该正常工作。大!