在 MongoDB 表达式中使用 $exists

问题描述 投票:0回答:2

对于背景,如果我想比较两个字段,我不能使用以下语法(因为它与文字字符串“$lastName”而不是 $lastName 字段的内容进行比较):

"$match": { "firstName": { $ne : "$lastName"} }

我必须用这个:

"$match": { "$expr": { $ne : [ "$firstName", "$lastName" ] } }

如果我想测试某个字段是否存在,我必须使用第一种格式:

"$match": { "fullName": { "$exists": true } }

我认为以后一种格式表达 $exists 运算符的正确方法会引发错误:

db.docs.aggregate([
  {
    "$match": { "$expr": { "$exists": [ "$fullName", true ] } }
  }
])
assert: command failed: {
        "ok" : 0,
        "errmsg" : "Unrecognized expression '$exists'",
        "code" : 168,
        "codeName" : "InvalidPipelineOperator"
} : aggregate failed

这是否意味着至少在某些情况下不可能组合这些操作?具体来说,假设我想查找 either $fullName $exists OR $firstName $ne $lastName 的文档。可以表达一下吗?

mongodb mongodb-query
2个回答
15
投票

您需要使用

$or
逻辑运算符来执行此操作。

{
   "$or": [
      {
         "$expr": {
            "$ne": [
               "$firstName",
               "$lastName"
            ]
         }
      },
      {
         "fullName": {
            "$exists": true
         }
      }
   ]
}

您上次查询失败,因为 mongod 认为

$exists
是您传递给
$expr
运算符的表达式。


2
投票

您可以使用

$type
运算符 来获取字段的类型。对于未定义的字段,这将是
"missing"

您可以通过这种非等式检查发现缺失的字段:

{$ne: [{$type: "$field"}, "missing"]}

请注意,存在但设置为

null
的字段将具有
"null"
类型,因此您可能还需要明确检查这种情况,参见文档中方便的类型表

对于您的上下文,完整的聚合管道阶段检查名字和姓氏之间的相等性全名字段是否存在,可能是这样的:

{
  "$match": {
    "$expr": {
      "$and": [
        { "$ne": [ { "$type": "$fullName" }, "missing" ] },
        { "$ne": [ "$firstName", "$lastName" ] }
      ]
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.