IntelliJ IDEA DataGrip执行MongoDB查询时NotSerializableException异常
问题解决:DataGrip中MongoDB聚合变量$in查询序列化异常
问题场景
在IntelliJ IDEA DataGrip的MongoDB查询控制台中,先通过聚合查询生成字符串数组ids:
let ids = db.collection.aggregate([ { $match: { ... } }, { $group: { _id: "$field" } } ]).map(doc => doc._id);
随后在第二个聚合查询中使用该变量:
db.collection.aggregate([ { $match: { "field": { $in: ids }, ... } } ]);
第一个查询执行成功,但第二个查询抛出序列化异常:
Error unmarshaling return nested exception is: WriteAbortedException writing aborted; NotSerializableException: com.oracle.truffle.api.TruffleStackTraceElement
直接将$in参数替换为['1', '2']这类原生JS数组时,查询可正常执行,确认问题出在ids变量的类型上。
原因分析
DataGrip的MongoJS执行环境基于Truffle框架,aggregate()返回的游标调用map()后得到的并非纯粹的原生JavaScript数组,而是带有Truffle内部标记的特殊对象,当将其传入MongoDB查询时,序列化过程无法处理这类内部元素,导致抛出NotSerializableException。
解决办法
将ids转换为原生JavaScript数组即可,有两种常用方式:
方式1:先调用toArray()再处理
先把聚合结果转为原生数组,再提取_id字段:
let ids = db.collection.aggregate([ { $match: { ... } }, { $group: { _id: "$field" } } ]).toArray().map(doc => doc._id);
方式2:用Array.from()转换
直接将map后的结果转为原生数组:
let ids = Array.from(db.collection.aggregate([ { $match: { ... } }, { $group: { _id: "$field" } } ]).map(doc => doc._id));
两种方式都能确保ids是纯粹的JS数组,传递给$in时不会触发序列化异常。
内容的提问来源于stack exchange,提问作者naXa
相关产品推荐
相关产品推荐

