如何在mongodb聚合中检查子字段是不是存在且不为空?
Posted
技术标签:
【中文标题】如何在mongodb聚合中检查子字段是不是存在且不为空?【英文标题】:How to check if sub-field exists and is not null in mongodb aggregation?如何在mongodb聚合中检查子字段是否存在且不为空? 【发布时间】:2017-08-16 05:42:58 【问题描述】:我遇到了一个非常烦人的问题,我似乎无法为我的具体情况找到任何解决方案。在我的 mongo 聚合管道中,我想添加一个字段,并且根据另一个字段的子字段的存在,我想分配该其他字段的子字段的值,或者如果该其他字段的子字段不存在,则为 1。
这是我尝试过的:
pipelineStages.push(
$addFields:
field:
$cond: [
$ne: ["$otherField.subField", null],
"$otherField.subField", 1]
);
但是,它仅适用于该字段存在的情况。另一方面,该新字段根本没有添加到管道中。任何想法我做错了什么?
【问题讨论】:
类似$addFields: field: $ifNull: [ "$otherField.subField", 1 ]
MongoDB aggregate by field exists的可能重复
没有。就像我说的,我需要一个子字段的值,而不是一个字段。下面的答案没有涵盖这一点。
假设您有两个带有"otherField":"subField":2, "extraField":3, "otherField":"oneField":3
的文档。如果您运行上述查询,您应该得到"otherField" : "subField" : 2, "extraField" : 3, "field" : 2 "otherField" : "oneField" : 3 , "field" : 1
的输出。这不是你需要的吗?如果没有,请考虑在帖子中添加一些示例文档。
【参考方案1】:
你试过这个版本的条件吗:
pipelineStages.push( $addFields:
field:
$cond: [$and: ["$otherField": "$exists": true, "$otherField.subField": "$exists": true], "$otherField.subField", 1]
);
【讨论】:
是的,它不会让我用'.'指定一个字段签名。 如果尝试像我此时编辑代码?也没有效果?【参考方案2】:将$ifNull
包装在$cond
中可以解决问题,即使存在子字段问题。
pipelineStages.push(
$addFields:
newField:
$cond: [
"$ifNull": [
"$otherField.subField",
false
]
,
"$otherField.subField",
1
]
);
【讨论】:
【参考方案3】:要检查字段是否存在且不为空,请使用:
pipelineStages.push(
$addFields:
field:
$cond: [
"$gt": [$otherField, null], "$otherField.subField", 1
]
)
相反,要检查该字段是否不存在或为空,请使用:
"$lte": [$otherField, null]
【讨论】:
以上是关于如何在mongodb聚合中检查子字段是不是存在且不为空?的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB 字段索引后,如何快速检查一个该字段的数值是不存在的