जब मेरे संग्रह में एक ही क्वेरी में वापसी करने के लिए बहुत बड़ा हो जाता है तो यह समाधान। यह _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;
}
);