【问题标题】:Simplest way to negate $all in mongoDB在 mongoDB 中否定 $all 的最简单方法
【发布时间】:2017-11-16 12:07:45
【问题描述】:

我正在通过我的应用程序在mongoDB 3.4 上运行以下查询。基本上,我想使用 $elemMatch

找到属性数组具有与指定条件匹配的元素的文档
db.collectionName.find({
    attributes: {
        $all: [{
            $elemMatch: {
                "name": "manufacturer",
                "value": "val1",
                "status": 1
            }
        }, {
            $elemMatch: {
                "name": "model",
                "value": "val2",
                "status": 1
            }
        }]
    }
})

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

我怎样才能做到这一点?

如果可能,我宁愿不更改要传递给 $all 的数组

【问题讨论】:

  • docs.mongodb.com/manual/reference/operator/query/not 和 de-morgan 定理(如果您的情况需要)。
  • De-Morgan 会要求我编辑数组的元素,所以我试图避免它。 $not 虽然有效,所以如果您发布答案,我现在会接受。
  • 不太清楚您要提出什么情况,但$not 在上下文“我认为”您的意思是不需要对数组参数进行任何更改。它只是一个“否定”,将在查询表达式中的$all 之前应用。除非你的意思是别的。可以处理数据样本和预期结果。
  • **$not** 不会。 **De-Morgans** 会。
  • 显示示例。如果您认为每个元素都需要$ne,那么您可能弄错了。这就是为什么我认为您确实需要发布一些示例数据和预期结果。我看到了$not 的一个明确案例,我“认为”你的实际意思。但我的预期结果可能与您的预期不同。所以减轻困惑,向我们展示一些我们可以复制的东西。如果你这样做,它将帮助你得到正确的答案。

标签: mongodb mongodb-query


【解决方案1】:

使用 cmets 中 @nullpointer 建议的 $not 运算符,我可以这样做:

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

})

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2013-04-19
    • 1970-01-01
    • 2014-04-22
    • 2019-10-16
    • 2021-01-16
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多