在mongoDB中否定$ all的最简单方法

时间:2017-11-16 03:27:26

标签: mongodb mongodb-query

我通过我的应用程序在mongoDB 3.4上运行以下查询。基本上,我想找到文档,其中属性数组具有使用 $ elemMatch

符合指定条件的元素
db.collectionName.find({
    attributes: {
        $all: [{
            $elemMatch: {
                "name": "manufacturer",
                "value": "val1",
                "status": 1
            }
        }, {
            $elemMatch: {
                "name": "model",
                "value": "val2",
                "status": 1
            }
        }]
    }
})

但是,与此同时,我想运行另一个查找查询来查找上述查找条件失败的记录,即使一个 $elemMatch失败

我怎样才能实现这个目标?

如果可能的话,我宁愿不改变我传递给全部的数组

1 个答案:

答案 0 :(得分:1)

在评论中使用 $ not 运算符作为@nullpointer的建议,我能够这样做:

db.collectionName.find({
    attributes: {
        $not: {
            $all: [{
                $elemMatch: {
                    "name": "manufacturer",
                    "value": "val1",
                    "status": 1
                }
            }, {
                $elemMatch: {
                    "name": "model",
                    "value": "val2",
                    "status": 1
                }
            }]
        }
    }
})

另一种我试图避免但可以使用的替代方案是 De-Morgan定理,其中包括:

NOT(A AND B和C) = NOT A OR NOT B OR NOT C ,这将构成查询

db.collectionName.find({
    attributes: {
        $or: [{
            $elemMatch: {
                "name": "manufacturer",
                "value": {"$ne": "val1"},
                "status": 1
            }
        }, {
            $elemMatch: {
                "name": "model",
                "value": {"$ne": "val2"},
                "status": 1
            }
        }]
    }

})