使用$and和多个$or查询MongoDB

9

正如文档中所述,这是不可能的。


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

考虑以下示例:

db.inventory.find( {
    $and : [
        { $or : [ { price : 0.99 }, { price : 1.99 } ] },
        { $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
    ]
} )

以下查询将返回所有符合以下条件的文档:

价格字段值等于0.99或1.99,且销售字段的值为true或者数量字段的值小于20。

由于使用了多个$or运算符,因此无法使用隐式AND操作构建此查询。


如何解决这样的查询问题?MongoDB 3.2上没有返回结果。我已经分别测试了$or块,并且它们可以正常工作,但在$and块中包含它们时却不行。我认为我并没有错误地阅读文档,这不应该起作用。我唯一的替代方案是将数据推送到ElasticSearch并在那里查询,但这也只是一个解决方法。

{
    "$and": [
        {
            "$or": [
                {
                    "title": {
                        "$regex": "^.*html .*$",
                        "$options": "i"
                    }
                },
                {
                    "keywords": {
                        "$regex": "^.*html .*$",
                        "$options": "i"
                    }
                }
            ]
        },
        {
            "$or": [
                {
                    "public": true
                },
                {
                    "domain": "cozybid"
                }
            ]
        }
    ]
}
1个回答

18

文档没有说明这是不可能的,它只是说:

此查询不能使用隐式AND操作符构建, 因为它使用了多个$or运算符。

这意味着这将起作用:

db.inventory.find( {
    $and : [
        { $or : [ { price : 0.99 }, { price : 1.99 } ] },
        { $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
    ]
} )

但这个不行,因为它是一个带有两个 $or隐式 $and

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

我猜你面临的问题是,在你的收藏中没有匹配你请求的文档。


1
我在发布问题后意识到,我的团队已经在服务器上回滚了数据。你是完全正确的。这是不应该工作的隐式AND。 - juminoz
如果出现 $and,则替换为 $or。 - Navi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接