mongoose 查找对象数组mongodb中是否不存在值

kzmpq1sx  于 2023-02-04  发布在  Go
关注(0)|答案(2)|浏览(273)

我想检查一个字段是否存在于一个对象数组中,假设文档中有一个名为attributes的数组:

[
  {
    attributes: [
      {
        name: "Cool",
        value: true
      }
    ]
  }
]

我希望找到未指定的项。我将使用$或运算符来查找空值

$attributes: {
    $elemMatch: {
        $or: [
           { name: 'cool', value: '' },
           { name: 'cool', value: { $exists: false } },

           { name: {ne: 'cool' } ?????
        ]
    }
}

但我想查找{name:'Cool'}不在数组中,我无法理解语法。
任何帮助都将是巨大的,非常感谢

4sup72z8

4sup72z81#

$elemMatch表达式之外,简单的$ne用法就足够了,Mongo对大多数查询“扁平化”数组,因此如果数组中的单个元素与查询匹配,它就满足条件。
在您的情况下,如果您使用$ne,并且cool是其中一个元素,则条件将为“匹配”,文档将被排除,如下所示:

db.collection.find({
  "attributes.name": {
    $ne: "Cool"
  }
})

Mongo Playground

5sxhfpxr

5sxhfpxr2#

我遇到过一个类似的用例,数组中的任何元素都与搜索到的值不匹配,因此,我扩展了这个问题的答案。
如果在$elemMatch表达式中指定单个查询 predicate ,并且在$elemMatch中不使用$not或$ne运算符,则可以省略$elemMatch。reference

db.collection.find({
  "attributes": {
    $elemMatch: {
       "name": {
          $ne: "Cool"
        }
    }
  })

此查询返回结果数组中任何名称都不是“Cool”的文档。

db.collection.find({
  "attributes.name": {
    $ne: "Cool"
  }
})

此查询返回结果数组中所有名称都不是“Cool”的文档。

相关问题