在使用 Bluebird 承诺 mongodb 后,使用 mongodb 的查找游标的 next/each 函数作为承诺的方法
Way to use mongodb's find cursor's next/each functions as a promise after promisifying mongodb with Bluebird
- 节点 mongodb docs 指定对大量文档使用 next/each 以便在我们使用 toArray 时不会将所有内容都加载到内存中。
- 所以,我认为我的示例代码应该可以正常工作。但它只是 returns 一个文档。
- 处理这个问题的正确方法应该是什么?
这是我的代码示例:
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 基本上类似于函数 return
s,因为一个函数不能 return 多个值——将 each
转换为一个 promise returning 函数是没有意义的。
你可以做的是将其转换为 Observable returning 函数,然后在其上使用 .forEach
以获得完成序列的承诺,或者你可以手动实现类似的东西:
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 连接是持久的,您应该在服务器启动时连接一次,然后在服务器 运行.[=16 期间一直保持连接打开状态=]
- 节点 mongodb docs 指定对大量文档使用 next/each 以便在我们使用 toArray 时不会将所有内容都加载到内存中。
- 所以,我认为我的示例代码应该可以正常工作。但它只是 returns 一个文档。
- 处理这个问题的正确方法应该是什么?
这是我的代码示例:
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 基本上类似于函数 return
s,因为一个函数不能 return 多个值——将 each
转换为一个 promise returning 函数是没有意义的。
你可以做的是将其转换为 Observable returning 函数,然后在其上使用 .forEach
以获得完成序列的承诺,或者你可以手动实现类似的东西:
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 连接是持久的,您应该在服务器启动时连接一次,然后在服务器 运行.[=16 期间一直保持连接打开状态=]