我试图通过mongoose访问一个包含超过一百万个文档(1281034)的集合,但没有成功。
我试过这三种方式:
正常访问整个集合
@find({},'_id n').exec (error, value) ->
Mongoose:items.find({}){fields:{n:1,_id:1}}
有限制,这可行,但99999(允许的最大值)限制其不够
@find({},'_id n').limit(99999).exec (error, value) ->
Mongoose:items.find({}){limit:99999,fields:{n:1,_id:1}}
使用流,这也可以,但会出现内存不足错误
stream = @find({},'_id n').stream()
stream.on('data', (doc)->
results.push doc
console.log "#{results.length}"
).on('close', ->
console.log "Finished : #{results.length}"
)
在415786文件中崩溃:(致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足)
答案 0 :(得分:0)
最后我的解决方案是避免在查询结果中存储数百万个项目。我发现最好的方法是使用NodeJS流,所以我不需要使用大量内存。
stream = @find({}).stream()
stream.on('data', (doc)->
Redis.push('items',JSON.stringify(doc))
)
如果您想要一种更具可读性的方式,您还可以将.pipe()
方法链接起来并将其传递给writeableStream
。