注意:我不相信这个问题is a duplicate of this similar question,因为它更具体。
我正在尝试使用nodejs-mongodb-driver从Mongo检索多个对象,并将对象作为JSON写入HTTP响应。对象应该是数组的形式,但我不想因为内存开销而在游标上调用toArray()
,并尽可能避免大JSON.stringify
次调用。
var response = ... // an http response
collection.find().stream(JSON.stringify).pipe(response); // causes a malformed JSON string
浏览器中的对象显示如下。
{"obj", "obj"}{"obj", "obj"} // clearly malformed
有一种有效的方法吗?
答案 0 :(得分:1)
我将解释您编写的代码,以便您了解为什么它会返回格式错误的JSON以及为什么您可能需要toArray()
或您发布的答案中的JSONStream库。
首先collection.find()
返回Cursor
个对象。那时没有读取数据。然后,.stream(JSON.stringify)
调用返回带有转换函数Stream
的可读JSON.stringify
。仍然没有数据读。
.pipe(response)
调用会将整个Stream
读取到最后,并为每个对象调用JSON.stringify
函数。请注意,它确实单独为每个object
调用它,因此不会创建array
。相反,您会在object
之后获得格式错误的 JSON,object
。
现在,您发布的可能重复的问题(Stream from a mongodb cursor to Express response in node.js)中的答案对您有用,但它需要一个JSONStream
的附加库。 JSONStream正确处理CursorStream
JSON
输出。我不知道这是否真的减少了开销,但你可以试试。
如果没有添加图书馆,则必须使用toArray()
。