如documentation所述,这是不可能的。
考虑以下示例:
db.inventory.find( {
$and : [
{ $or : [ { price : 0.99 }, { price : 1.99 } ] },
{ $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
]
} )
此查询将返回所有选择所有文档:
价格字段值等于0.99或1.99,并且 销售字段值等于true或qty字段值小于20.
此查询无法使用隐式AND操作构建,因为它多次使用$或运算符。
查询此类内容的解决方法是什么?此查询在MongoDB 3.2上不返回任何结果。我已经分别测试了$或块,它们工作正常,但不是当它们被包裹在$和块中时。我以为我没有错误地阅读文档,认为这不应该起作用。我唯一的选择是将数据推送到ElasticSearch并在那里查询,但这也只是一种解决方法。
{
"$and": [
{
"$or": [
{
"title": {
"$regex": "^.*html .*$",
"$options": "i"
}
},
{
"keywords": {
"$regex": "^.*html .*$",
"$options": "i"
}
}
]
},
{
"$or": [
{
"public": true
},
{
"domain": "cozybid"
}
]
}
]
}
答案 0 :(得分:10)
文档并未说明这是不可能的。它只说
无法使用隐式AND操作构造此查询, 因为它多次使用$或运算符。
这意味着这将有效:
db.inventory.find( {
$and : [
{ $or : [ { price : 0.99 }, { price : 1.99 } ] },
{ $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
]
} )
但这不会,因为它是一个隐式 $and
,有两个 $or
db.inventory.find({
{ $or : [ { price : 0.99 }, { price : 1.99 } ] },
{ $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
})
在线试用:mongoplayground.net/p/gL_0gKzGA-u
以下是一个隐含的 $and
:
db.inventory.find({ price: { $ne: 1.99, $exists: true } })
我想您遇到的问题是您的收藏中没有与您的请求匹配的文档