我正在尝试运行MongoDB查询以返回所有不匹配一个值或另一个值的文档。在查阅了文档之后,我看到了这个例子:
IList
这就是我尝试过的:
{ $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] }
这会导致错误:
“未知的顶级运算符:$ ne”
我也尝试过:
{ $or: [ { paymentType: { $ne: "full" } }, { $ne: "partial" } ] }
......但这只是返回所有文档,而未对“ paymentType”属性进行任何过滤。
这里的正确语法是什么?
答案 0 :(得分:2)
您的第三版代码语法正确。
但是逻辑似乎是错误的。
您的查询已翻译为:
paymentType != full or paymentType != partial
这实际上始终成立,(因为一个paymentType
的值不能同时为full
和partial
。)
更新
为了澄清,我要查询的内容(用简单的英语)是返回“ 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
,则相同。