MongoDB聚合管道拼接两个$lookup返回数组结果为null如何解决
MongoDB聚合$concatArrays返回null问题排查
问题现象
在单条聚合管道中拼接两次$lookup返回的数组时,$concatArrays执行结果始终为null。已确认两次$lookup执行正常,返回值均为数组类型,同一$project阶段可正常访问这两个字段。
问题涉及的$project阶段代码:
{ $project: { _id: 0, visitsTime: 1, bracketsTime: 1, chartResult: { $concatArrays: [ "$visitsTime", "$bracketsTIme" ] } } }
执行返回结果:
[ { "bracketsTime": [ { "date": "04-08-2022", "entryHours": 4.25 }, { "date": "04-10-2022", "entryHours": 6.5 } ], "chartResult": null, "visitsTime": [ { "date": "04-20-2022", "visitHours": 1 }, { "date": "04-10-2022", "visitHours": 3 }, { "date": "04-08-2022", "visitHours": 2 }, { "date": "05-26-2022", "visitHours": 2 } ] } ]
问题原因
属于字段名大小写拼写错误:
- 实际存在的数组字段名为
bracketsTime,后缀Time仅首字母T大写,后续i、m、e均为小写 $concatArrays中引用的字段误写为$bracketsTIme,后缀第二个字母I错误大写
MongoDB字段名严格区分大小写,引用不存在的字段时会返回null;而$concatArrays的运算规则是只要任意入参不是数组(包含null、字段不存在、值为其他类型的情况),整个表达式就会返回null,这就是结果始终为空的根本原因,和$lookup的返回值类型没有关系。
修复方法
把$concatArrays里的字段引用改成正确拼写即可:
{ $project: { _id: 0, visitsTime: 1, bracketsTime: 1, chartResult: { $concatArrays: [ "$visitsTime", "$bracketsTime" ] } } }
修改后chartResult会正常返回两个数组合并后的结果。
优化建议
如果业务场景中存在$lookup匹配不到数据、字段可能为空的情况,可以搭配$ifNull给字段设置空数组默认值做兜底,避免单字段为空导致整个拼接结果失效,写法参考:
chartResult: { $concatArrays: [ { $ifNull: ["$visitsTime", []] }, { $ifNull: ["$bracketsTime", []] } ] }
内容的提问来源于stack exchange,提问作者Jowz
相关产品推荐
相关产品推荐

