Mongo查找不包含给定值的文档(使用$ not)

kru*_*ubo 10 mongodb

我在MongoDB中有两个项目:

{'title':'active item',
 'tags':[
        {'tag':'active'},
        {'tag':'anothertag'}
]}
{'title':'completed item',
 'tags':[
        {'tag':'completed'}
]}
Run Code Online (Sandbox Code Playgroud)

它可以找到标记为已完成的项目:

db.items.find({'tags.tag':'completed'})
RESULT: [<completed item>]
Run Code Online (Sandbox Code Playgroud)

现在,我想选择所有未标记为已完成的项目,所以我尝试了:

db.items.find({$not:{'tags.tag':'completed'}})
DESIRED RESULT: [<active item>]
ACTUAL RESULT: []
Run Code Online (Sandbox Code Playgroud)

但不知何故,这并没有返回任何结果.很明显我误解了不是在Mongo,但为什么?如何查询以查找其标记中不包含给定值的记录?

Joh*_*yHK 14

$not运算符的目标需要是operator-expression,而不是field/value对象.

所以parvin的答案是最简单的方法,但是出于学习目的,您可以$not使用$not支持的表达式来完成此操作,例如:

db.items.find({tags: {$not: {$elemMatch: {tag: 'completed'}}}})

db.items.find({'tags.tag': {$not: /completed/}})
Run Code Online (Sandbox Code Playgroud)


Par*_*ade 8

您可以使用$ne运算符来完成。

db.items.find({"tags.tag" : {$ne : "completed"}})
Run Code Online (Sandbox Code Playgroud)

  • +1 它有效,但为什么呢?以我的 SQL 背景,我认为 $ne 会不正确地排除没有任何标签的项目。为什么$不做我想做的事? (2认同)