MongoDB视图修改:按bArray存在性条件选择数组字段
解决方案
首先纠正你原有代码里的一个小问题:你定义了两个相同的键arrayFieldNew1,这会导致后一个覆盖前一个,最终只能得到$aArray.arrayField2的值,应该把第二个键名改成arrayFieldNew2。
针对你需求的优先使用bArray、不存在则回退到aArray的逻辑,可以用MongoDB的$ifNull操作符实现,它会优先返回第一个非空/存在的字段值,示例代码如下:
$replaceRoot : { newRoot: { $mergeObjects: [ { $let: { vars: { // 优先取bArray,不存在则用aArray targetArray: { $ifNull: ['$bArray', '$aArray'] } }, in: { arrayFieldNew1: '$$targetArray.arrayField1', arrayFieldNew2: '$$targetArray.arrayField2' } } } ] } }
逻辑说明
$ifNull: ['$bArray', '$aArray']:检查bArray是否存在且不为null,满足则使用bArray,否则使用aArray$let:定义临时变量targetArray,避免重复写判断逻辑,让代码更简洁- 最后从
targetArray中提取对应的子字段,映射到新的键名上
如果你不想用$let,也可以针对每个字段单独使用$ifNull,效果一致:
$replaceRoot : { newRoot: { $mergeObjects: [ { arrayFieldNew1: { $ifNull: ['$bArray.arrayField1', '$aArray.arrayField1'] }, arrayFieldNew2: { $ifNull: ['$bArray.arrayField2', '$aArray.arrayField2'] } } ] } }
内容的提问来源于stack exchange,提问作者Mohit Aggarwal
相关产品推荐
相关产品推荐

