对于背景,如果我想比较两个字段,我不能使用以下语法(因为它与文字字符串“$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 的文档。可以表达一下吗?
您需要使用
$or
逻辑运算符来执行此操作。
{
"$or": [
{
"$expr": {
"$ne": [
"$firstName",
"$lastName"
]
}
},
{
"fullName": {
"$exists": true
}
}
]
}
您上次查询失败,因为 mongod 认为
$exists
是您传递给 $expr
运算符的表达式。
$type
运算符 来获取字段的类型。对于未定义的字段,这将是 "missing"
。
您可以通过这种非等式检查发现缺失的字段:
{$ne: [{$type: "$field"}, "missing"]}
请注意,存在但设置为
null
的字段将具有 "null"
类型,因此您可能还需要明确检查这种情况,参见文档中方便的类型表。
对于您的上下文,完整的聚合管道阶段检查名字和姓氏之间的相等性和全名字段是否存在,可能是这样的:
{
"$match": {
"$expr": {
"$and": [
{ "$ne": [ { "$type": "$fullName" }, "missing" ] },
{ "$ne": [ "$firstName", "$lastName" ] }
]
}
}
}