在Node.js中使用MongoDB进行扩展,我应该什么时候一次查询所有的ID,并行查询每个ID?

可以说我有一个处理N个用户的脚本。 脚本可以看两种方法之一,假设资源充足,速度会更快吗? 我可以使用Promise.allasync.parallel

选项1

 function processUsers(userIds) { monog.find({_id: { $in: userIds }, (userDocs) => { const tasks = userDocs.map((userDoc) => processUser(userDoc)) async.parallel(tasks, (err, results) => console.log('finished')) }); } 

选项2

 function processUsers(userIds) { const tasks = userIds.map((userId) => { mongo.findOne({_id: userId}, (err, userDoc) => { processUser(userDoc); }) }) async.parallel(tasks, (err, results) => console.log('finished')) } 

最好的select是一次读取所有内容,或者至less读入大块内容。 绝对不要一一阅读,这将是很多不必要的数据库stream量。 如果你认为自己有足够的记忆,一次全部阅读。

另外,随机想法,但如果processUser涉及数据库写入,您可以收集结果,并使用bulkWrite来加速事情甚至更多。

选项1似乎是一个更好的selectIMO。 find()findOne() find()执行得更好,因为使用find()你会得到一个游标而不是数据库中的实际数据。 遍历这个游标将比使用findOne()单独获取每个文档给出更好的结果。

我会说这取决于。

这两个操作:查询(find / findOne)和数据处理(processUser()) – 根据哪一个在实际的虚拟机上需要更多的工作,你可能想要使它们利用Node.js的asynchronous行为。 例如,如果find()的处理时间是几秒钟,那么你可能希望这个进程是asynchronous的,因为你不想把它们sorting来增加整个时间。

虽然通常db查询是I / O绑定的,比内存绑定操作耗时更多,但我们必须实际看到工作负载的特殊性,并相应地进行调用。

希望这可以帮助。