Jaspersoft Studio中MongoDB查询$arrayToObject报错及格式转换问题
问题原因和解决方案
1. $arrayToObject报错根因
你遇到的报错是因为orderlogss数组中存在没有stat字段的元素(你提供的样本数据里第4个日志元素仅包含ctr和time字段):
'$arrayToObject requires an object keys of 'k' and 'v'. Found incorrect number of keys:1'
当$map处理无stat字段的元素时,生成的对象中k值为null,Jaspersoft Studio的MongoDB驱动会默认删除值为null的键,导致该元素仅剩下v一个键,触发$arrayToObject的格式校验失败。
2. 字段类型保留方案
要让ctr保持ObjectId格式、time保持ISODate格式,需做两处调整:
- 在Jaspersoft Studio的MongoDB数据源配置中,关闭「自动将BSON类型转换为字符串」的默认选项
- 查询中不要手动对ObjectId、ISODate字段做字符串拼接/转换操作,直接引用原生字段即可
3. 修复后的查询语句
你可以先过滤无stat的日志元素,再执行后续转换,若需要同时保留ctr和time字段,可以调整v的结构:
[ { $project: { itemfinal: "$items", ordernumberfinal: "$ordernumbers", rows: { $arrayToObject: { $map: { // 先过滤掉没有stat字段的日志元素 input: { $filter: { input: "$orderlogss", cond: { $ne: ["$$this.stat", undefined] } } }, in: { "k": "$$this.stat", // 如果不需要保留ctr,直接把v替换为"$$this.time"即可 "v": { "ctr": "$$this.ctr", "time": "$$this.time" } } } } } } }, { "$addFields": { "rows.finalitem": "$itemfinal", "rows.finalorder": "$ordernumberfinal" } }, { "$replaceRoot": { "newRoot": "$rows" } } ]
注意事项
你的样本数据中存在2条stat为Ordered的日志,$arrayToObject会默认用最后出现的元素覆盖前面相同key的内容,如果需要保留所有日志,可以将k修改为{$concat: ["$$this.stat", "_", {$toString: "$$this.ctr"}]},用stat+ctr的唯一值作为key。
内容的提问来源于stack exchange,提问作者Jayven Javier
相关产品推荐
相关产品推荐

