使用$和和$ $或查询MongoDB

时间:2016-11-02 19:55:30

标签: mongodb search operators expression

documentation所述,这是不可能的。

AND多个表达式的查询指定相同的运算符

考虑以下示例:

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"
                }
            ]
        }
    ]
}

1 个答案:

答案 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 } })

我想您遇到的问题是您的收藏中没有与您的请求匹配的文档