MongoDB中如何根据字段存在性条件投影content字段?
MongoDB条件投影content字段:根据contentWithInfo是否存在切换值
现有MongoDB文档如下:
{ "metadata": { "docId": "7b96a" }, "items": { "content": "abcd", "contentWithInfo": "content with additional info" } }
需求:根据contentWithInfo字段是否存在进行条件投影:
- 若
contentWithInfo存在,将其值作为content字段返回,且不返回contentWithInfo; - 若
contentWithInfo不存在,直接返回原content字段的值。
尝试的查询及问题
使用以下聚合查询:
db.collection1.aggregate([ { "$match": { "metadata.docId": { "$in": [ "7b96a" ] } } }, { "$unwind": "$items" }, { "$project": { "metadata": 1, "items.content": { "$cond": { "if": { "$eq": [ "$items.contentWithInfo", null ] }, "then": "$items.content", "else": "$items.contentWithInfo" } } } } ])
- 当
contentWithInfo存在时,返回结果符合预期:
{ "metadata": { "docId": "7b96a" }, "items": { "content": "content with additional info" } }
- 当
contentWithInfo不存在时,返回结果不符合预期:
{ "metadata": { "docId": "7b96a" }, "items": {} }
期望结果:
{ "metadata": { "docId": "7b96a" }, "items": { "content": "abcd" } }
解决方案
问题出在两个核心点:
- 错误使用
$unwind:items是对象而非数组,$unwind仅适用于数组字段,该操作会导致非数组字段处理异常; - 字段存在判断不准确:用
$eq判断null无法区分「字段不存在」和「字段值为null」的场景,需用$exists操作符精准判断字段是否存在。
修正后的查询:
db.collection1.aggregate([ { "$match": { "metadata.docId": { "$in": ["7b96a"] } } }, { "$project": { "metadata": 1, "items.content": { "$cond": { "if": { "$exists": ["$items.contentWithInfo", true] }, "then": "$items.contentWithInfo", "else": "$items.content" } } } } ])
说明
- 移除了错误的
$unwind步骤,直接处理items对象; - 使用
$exists: ["$items.contentWithInfo", true]准确判断字段是否存在; - 无论
contentWithInfo是否存在,都会正确返回items.content字段,完全符合需求。
内容的提问来源于stack exchange,提问作者chitra
相关产品推荐
相关产品推荐

