node.js - 在使用 Bluebird promise mongodb 后,使用 mongodb 的查找游标的 next/each 函数作为 promise 的方法

标签 node.js mongodb promise bluebird node-mongodb-native

  • 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/

相关文章:

node.js - Windows命令行打开与命令同名的文件

javascript - SQL node.js 看似有效的查询存在语法错误?

c# - 在 MongoDB 中存储动态 JSON 数据

javascript - React-Router 中的 useloaderdata() 是否解析了 Promise?

javascript - 我无法访问我的异步验证器,因为它位于 "__zone_symbol"对象中

node.js - 如何允许特定服务器访问我的API?

javascript - 将 R 及其图形与现有的 Javascript/HTML 应用程序集成

MongoDb 聚合查询 $group 和 $push 到子文档中

python - 如何获取适合 isinstance() 的 pymongo 数据库类?

javascript - $.when.apply 在 Angular AJAX promise 实现中?