MongoDB 3.4基于数组值初始化新字段失败问题排查
MongoDB 3.4 数组匹配字段赋值问题排查与解决
错误原因
你的聚合语句中,$MyArray.Name会返回MyArray数组内所有元素的Name字段组成的数组(例如["A", "X", "B"])。用$eq将这个数组直接与字符串"X"比较时,数组和字符串类型不匹配,条件永远不成立,因此$cond始终走else分支,所有文档的ArrayId都被设为空字符串。
实现方案(MongoDB 3.4)
利用$filter筛选目标数组元素,结合$arrayElemAt获取第一个匹配项,再通过$ifNull处理无匹配的情况,最终得到目标字段值:
db.getCollection('myCollection').aggregate([ { $addFields: { "ArrayId": { $let: { vars: { matchedItem: { $arrayElemAt: [ { $filter: { input: "$MyArray", as: "item", cond: { $eq: ["$$item.Name", "X"] } } }, 0 ] } }, in: { $ifNull: ["$$matchedItem.MyId", ""] } } } } }, { $out: "myCollection_backup" } ])
各操作符作用说明
$filter:遍历MyArray,筛选出所有Name等于"X"的元素,返回筛选后的数组(无匹配则为空数组)$arrayElemAt:从筛选后的数组中取出第一个元素(假设Name为X的元素最多一个)$let:定义临时变量存储匹配到的元素,简化后续逻辑$ifNull:若匹配元素不存在(即$$matchedItem为null),返回空字符串;否则返回匹配元素的MyId值
内容的提问来源于stack exchange,提问作者Dmitry Mubarakshin
相关产品推荐
相关产品推荐

