MongoDB:根据另一个字段的存在情况投影指定字段
解决方案:仅当文档无x字段时投影y字段
MongoDB的普通投影语法无法实现这种条件逻辑,得用聚合管道的$project阶段结合条件表达式来处理,具体实现如下:
基础实现代码
db.yourCollectionName.aggregate([ { $project: { _id: 1, // 按需保留或移除_id,设为0则不返回 y: { $cond: { if: { $not: { $exists: "$x" } }, // 判断x字段是否不存在 then: "$y", // 满足条件时返回y字段的值 else: "$$REMOVE" // 不满足时移除y字段 } } } } ])
代码说明
$exists: "$x"用于检查当前文档是否包含x字段,外层的$not取反后,就得到“x字段不存在”的判断条件$cond是MongoDB的条件分支操作符,根据判断结果决定y字段的处理方式:符合条件则保留y的值,否则用$$REMOVE常量完全移除该字段- 默认情况下
_id会被保留,如果你不需要返回_id,可以将其设为_id: 0
测试结果
针对你提供的示例数据:
_id: "1"的文档无x字段,返回结果为{ "_id": "1", "y": "project" }_id: "2"的文档有x字段,返回结果为{ "_id": "2" }(如果需要保留x字段,可在$project里添加x: 1)
保留x字段的版本
如果需要同时返回x字段,调整后的代码如下:
db.yourCollectionName.aggregate([ { $project: { _id: 1, x: 1, // 保留x字段 y: { $cond: { if: { $not: { $exists: "$x" } }, then: "$y", else: "$$REMOVE" } } } } ])
此时_id: "2"的返回结果为 { "_id": "2", "x": "has x" },完全符合需求。
内容的提问来源于stack exchange,提问作者ABCDEV
相关产品推荐
相关产品推荐

