Це рішення, яке я використав, коли моя колекція зросла занадто великою, щоб повернутися в одному запиті. Він використовує переваги властивого впорядкування _id
поля і дозволяє прокручувати колекцію за вказаним розміром партії.
Ось це як модуль npm, мангуст-пейджинг , повний код нижче:
function promiseWhile(condition, action) {
return new Promise(function(resolve, reject) {
process.nextTick(function loop() {
if(!condition()) {
resolve();
} else {
action().then(loop).catch(reject);
}
});
});
}
function findPaged(query, fields, options, iterator, cb) {
var Model = this,
step = options.step,
cursor = null,
length = null;
promiseWhile(function() {
return ( length===null || length > 0 );
}, function() {
return new Promise(function(resolve, reject) {
if(cursor) query['_id'] = { $gt: cursor };
Model.find(query, fields, options).sort({_id: 1}).limit(step).exec(function(err, items) {
if(err) {
reject(err);
} else {
length = items.length;
if(length > 0) {
cursor = items[length - 1]._id;
iterator(items, function(err) {
if(err) {
reject(err);
} else {
resolve();
}
});
} else {
resolve();
}
}
});
});
}).then(cb).catch(cb);
}
module.exports = function(schema) {
schema.statics.findPaged = findPaged;
};
Прикріпіть його до своєї моделі так:
MySchema.plugin(findPaged);
Тоді запитуйте так:
MyModel.findPaged(
{source: 'email'},
['subject', 'message'],
{step: 100},
function(results, cb) {
console.log(results);
cb();
cb(err);
},
function(err) {
throw err;
}
);