在MongoDB查询中一起使用$ or和$ ne运算符

时间:2018-08-21 13:41:54

标签: mongodb

我正在尝试运行MongoDB查询以返回所有不匹配一个值或另一个值的文档。在查阅了文档之后,我看到了这个例子:

IList

这就是我尝试过的:

{ $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] }

这会导致错误:

  

“未知的顶级运算符:$ ne”

我也尝试过:

{ $or:  [ { paymentType: { $ne: "full" } }, { $ne: "partial" } ] }

......但这只是返回所有文档,而未对“ paymentType”属性进行任何过滤。

这里的正确语法是什么?

3 个答案:

答案 0 :(得分:2)

您的第三版代码语法正确。

但是逻辑似乎是错误的。

您的查询已翻译为:

paymentType != full or paymentType != partial

这实际上始终成立,(因为一个paymentType的值不能同时为fullpartial。)

更新

  

为了澄清,我要查询的内容(用简单的英语)是返回“ paymentType”不是“ full”或“ partial”的所有结果。

在这种情况下,您应该改用$and。或$nin也不错。

记住该法则:

not (p or q) <=> (not p) and (not q)

答案 1 :(得分:0)

因此,感谢评论者指出我可以使用$nin$and,但不能使用$or。在这种特殊情况下,我发现最直观的另一个选择是$nor运算符,如下所示:

{ $nor:  [ { paymentType: { $ne: "full" } }, { paymentType: { $ne: "partial" }} ] }

这将返回所有与这些值都不匹配的文档。

答案 2 :(得分:0)

如果仅需要查找与这两个值都不匹配的all个文档,为什么不简单地将$or更改为$and?最简单,最短的方法是按照建议使用$nin,但不确定为什么将其与$nor / $or等复杂化。

{ $and:  [ { paymentType: { $ne: "full" } }, { paymentType: { $ne: "partial" }} ] }

将选择所有与这些值都不匹配的文档。它的阅读和理解要容易得多,然后您以$nor结尾的双重否定不是吗?

说给我所有不是full也不是partial的PaymentTypes。如果使用$nin,则相同。