You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:57:37