在MongoDB查询中同时使用$or和$ne运算符
我正在尝试运行MongoDB查询以返回与某个值不匹配的所有文档。查阅文档后,我看到了以下示例:在MongoDB查询中同时使用$or和$ne运算符,mongodb,Mongodb,我正在尝试运行MongoDB查询以返回与某个值不匹配的所有文档。查阅文档后,我看到了以下示例: { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } 这就是我所尝试的: { $or: [ { paymentType: { $ne: "full" } }, { $ne: "partial" } ] } 这将导致一个错误: '未知的顶级运算符:$ne' 我也试过: { $or: [ { paymentType: { $ne: "full"
{ $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] }
这就是我所尝试的:
{ $or: [ { paymentType: { $ne: "full" } }, { $ne: "partial" } ] }
这将导致一个错误:
'未知的顶级运算符:$ne'
我也试过:
{ $or: [ { paymentType: { $ne: "full" } }, { paymentType: { $ne: "partial" }} ] }
。。。但这只是返回所有文档,没有对“paymentType”属性进行过滤
这里的正确语法是什么?您的第三个版本的代码语法是正确的 但逻辑似乎是错误的 您的查询已转换为:
paymentType != full or paymentType != partial
这实际上总是正确的,(因为一个paymentType
值不能同时是full
和partial
)
更新
为了澄清这一点,我试图用简单的英语询问的是返回所有结果,其中“paymentType”不是“full”或“partial” 在这种情况下,您应该使用
$和。或者$nin
也不错
记住这条法律:
not (p or q) <=> (not p) and (not q)
非(p或q)(非p)和(非q)
因此,感谢一位评论者指出,我可以使用$nin
或$和
,但不能使用$或
。另一个选项是$nor
操作符,我发现在这种特殊情况下它最直观,如下所示:
{ $nor: [ { paymentType: { $ne: "full" } }, { paymentType: { $ne: "partial" }} ] }
这将返回与这两个值都不匹配的所有文档。如果需要查找与这两个值都不匹配的所有文档,为什么不简单地将$或更改为$和?最简单和最短的方法是按照前面的建议使用$nin
,但不确定为什么要用$nor
/$或等将其复杂化
{ $and: [ { paymentType: { $ne: "full" } }, { paymentType: { $ne: "partial" }} ] }
将选择与这两个值都不匹配的所有文档。它的阅读和理解要比你用$nor
no结尾的双重否定容易得多
它说给我所有不是完整的
和不是部分的付款类型。如果使用$nin
使用$nin
匹配单个字段,则相同。类似于{paymentType:{$nin:[“full”,“partial”]}
为了澄清,我试图查询的是——用简单的英语——返回“paymentType”不是“full”或“partial”的所有结果。然后use必须使用$和
。或者像上面建议的那样使用$nin
,这可能是正确的方法,正如上面建议的:{paymentType:{$nin:[“full”,“partial”]}很好。如果我在这里使用运算符,它应该是$,而不是$或。实际上,更好的是,$nor运算符:{$nor:[{paymentType:{$ne:{$ne:{$full}},{paymentType:{$ne:{$partial}]}我想这部分是主观偏好。对我来说,在心理上,$nor比$and更接近于我头脑中的逻辑,因此我在使用$or而不是$and时犯了错误。我很想知道为什么这会被降低。一点背景知识会有所帮助。