Mongo获取查询的反向结果

3

你好,我在尝试理解如何编写这个查询时遇到了问题。

我的集合是一系列像这样的条目:

{
  id:1,
  name:"peter",
  number:3
 }

我希望能够撰写一个查询,它可以返回除了名字为“peter”编号为3的文档以外的所有项目。
我知道我可以撰写如下内容的代码:
db.test.find({$and:[{'name':'peter'},{'num':3}]})

如何重写此查询以返回除匹配元素外的所有内容?

该查询旨在返回所有匹配项,但是否有任何方法可以重写此查询以返回除匹配元素外的一切?请注意保留HTML标记。

请参阅文档:http://docs.mongodb.org/manual/reference/operator/query/not/ - theWanderer4865
3个回答

4
$not 运算符要求一个字段必须被绑定,但在这种情况下它无法工作。基本上我不得不重新考虑我的查询,使用 德摩根定律

¬(A^B) = ¬(A)V¬(B)

NOT (A AND B) = NOT(A) OR NOT(B) 所以我的查询是:

db.test.find({ $or:[{name:{$not:{$eq:'peter'}}},{num:{$not:{$eq:3}}}]});

布尔代数来拯救我们了!

3
您可以使用一个小技巧,只需一条语句,就能使用$nor。您的唯一语句是原始查询。这个方法有效是因为$nor意味着所有条件都必须为假; 如果您只有一个条件,那么您就得到了它的否定。

因此,请尝试:

db.test.find({$nor:[{$and:[{'name':'peter'},{'num':3}]}]})

我认为这很好,因为它完全否定了您最初的查询。

嗨,Mario!如何为$nor查询构建复合索引。就像我已经为查询创建了索引,并想要为$nor查询创建反向索引一样。 - professrr
@professrr 我已经好几年没用过Mongo了,但我认为你不能真正为任意查询创建索引:复合索引是多个字段的索引,对于任何查询都不适用,即使使用$and也不行(如果我没记错的话)。如果你想获得更多细节,你也可以尝试在SO上发布这个问题。 - Mario Trucco
@professrr,然而在这个特定的例子中,我认为如果你在namenum上都有一个复合索引,它可能会被原始查询与$and一起使用,也可能会被其否定的$nor使用,因为最终我们是在检查索引字段的相等性或不等性。 - Mario Trucco

-1
您可以使用 $ne 操作符来测试不相等的情况:
find({$and: [{name: {$ne: peter}}, {num: {$ne: 2}}]})

问题在于它不会返回任何名称为“peter”的值,无论数量如何,反之亦然。 - scrineym

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接