- Node mongodb docs指定对大量文档使用 next/each ,以便在使用 toArray 时不会将所有内容加载到内存中。
- 所以,我认为我的示例代码应该按原样工作。但它只返回一个文档。
- 处理这个问题的正确方法应该是什么?
这是我的代码示例:
var findAsync = function (collection,query) {
return mongodb.MongoClient.connectAsync(mongodbServerString)
.then(function (db) {
return [db.collection(collection).find(query), db];
});
};
findAsync("UserProfile",{})
.spread(function (cursor,db) {
return [cursor.project({Email:true}),db];
})
.spread(function (cursor, db) {
return cursor.eachAsync().then(function (doc) {
console.log(doc);
}).catch(function () {
db.close();
});
});
最佳答案
Promise 代表奇异值。 Promise 基本上就像函数 return
一样,因为函数不能返回多个值 - 将 each
转换为 Promise 返回函数是没有意义的。
您可以做的是将其转换为 Observable返回函数,然后使用 .forEach
来获取完成序列的 promise ,或者您可以手动实现类似的东西:
function each(cursor, fn) {
return new Promise((resolve, reject) => {
cursor.forEach((err, data) => {
if(err) {
cursor.close();
return reject(err);
}
try { fn(data); } catch(e) { cursor.close(); reject(e); }
}, err => { { // finished callback
if(err) reject(err);
else resolve();
});
});
}
这会让你写:
each(cursor, doc => console.log(doc)).then(...).catch(...)
另请注意,Mongo 连接是持久的,您应该在服务器启动时连接一次,然后在服务器运行期间保持连接打开。
关于node.js - 在使用 Bluebird promise mongodb 后,使用 mongodb 的查找游标的 next/each 函数作为 promise 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35813999/