MongoDB 3.0聚合操作:仅为非空olderAdress数组的元素新增字段
MongoDB 3.0 适配聚合查询语句
MongoDB 3.0 版本不支持$addFields、$mergeObjects等高版本操作符,我们使用$project阶段结合原生支持的$cond、$map操作符实现需求,语句如下:
db.你的集合名.aggregate([ { $project: { // 保留原有所有顶层字段 type: 1, code: 1, Name: 1, currency: 1, status: 1, localization: 1, createDate: 1, olderAdress: { $cond: { // 先判断olderAdress是否为null if: { $eq: [ "$olderAdress", null ] }, // 为null直接返回原值 then: null, // 不为null则遍历数组每个元素追加字段 else: { $map: { input: "$olderAdress", as: "addrItem", in: { // 保留原有地址元素的所有属性 localization: "$$addrItem.localization", status: "$$addrItem.status", createDate: "$$addrItem.createDate", // 新增要求的标记字段 isItemOfOlderAddress: true } } } } } // 如果你期望结果里的字段名是正确拼写的olderAddress,把上面的键名olderAdress改成olderAddress即可 } } ])
补充说明
如果后续你升级到MongoDB 3.2及以上版本,可以用更简洁的写法,不需要显式列出所有要保留的顶层字段:
db.你的集合名.aggregate([ { $addFields: { olderAdress: { $cond: { if: { $eq: [ "$olderAdress", null ] }, then: null, else: { $map: { input: "$olderAdress", as: "addrItem", in: { $mergeObjects: [ "$$addrItem", { isItemOfOlderAddress: true } ] } } } } } } } ])
内容的提问来源于stack exchange,提问作者Patrick Teixeira
相关产品推荐
相关产品推荐

