Node.js中MongoDB aggregate返回循环JSON对象问题求助
解决Node.js中MongoDB aggregate $sample返回循环JSON转换错误
我之前也碰到过一模一样的问题!你在Node.js里用MongoDB的aggregate时踩了个典型的小坑——MongoDB Node.js驱动的aggregate方法回调里返回的不是直接的结果数组,而是一个游标(Cursor)对象,这个游标内部包含了循环引用的结构(比如指向数据库连接、迭代器的引用),当你尝试把它转成JSON返回时,Express的res.send()会调用JSON.stringify(),这时候就会触发「循环结构转JSON」的错误。
问题根源
在Mongo Shell里执行db.factslist.aggregate({ $sample: { size: 10 } }).pretty()时,Shell会自动帮你把游标迭代成数组并输出;但Node.js驱动不会自动做这个转换,你拿到的item是一个可迭代的游标对象,而不是你想要的10条文档数组。直接把这个游标对象塞进数组再返回,自然会因为循环引用报错。
修复后的代码(回调式)
只需要调用游标对象的toArray()方法,把它转换成真正的文档数组即可:
// GET an array of 10 Random Facts app.get('/facts', (req, res) => { db.collection('factslist').aggregate({ $sample: { size: 10 } }).toArray((err, items) => { if (err) { res.send({'error':'An error has occurred while fetching data'}); } else { res.send({ randomArray: items }); } }); });
更推荐的async/await写法
如果你想用更简洁、易读的现代写法,可以用async/await:
// GET an array of 10 Random Facts (async/await版本) app.get('/facts', async (req, res) => { try { const items = await db.collection('factslist').aggregate({ $sample: { size: 10 } }).toArray(); res.send({ randomArray: items }); } catch (err) { res.send({'error':'An error has occurred while fetching data'}); } });
这样修改后,你就能得到和Mongo Shell里一样的10条随机文档数组,而且不会再出现JSON转换错误啦!
内容的提问来源于stack exchange,提问作者xavier jon
相关产品推荐
相关产品推荐

