我正在进行一个非常大的Mongoose调用嵌套填充,然后对数据进行一些处理。
但是,由于嵌套的填充调用,我对Mongoose中的BSON文档达到了16MB的限制。
有什么可靠的方法?
let allDocuments = await exampleModel.find({
condition: true
}).populate({path: 'tvShows', populate: {path: 'views'}});
也许我可以闯入多个电话?但我不确定这样做的合理方式。感谢。
答案 0 :(得分:1)
您可以使用skip
和limit
查询参数实现自己的分页。
const query = yourModel.find({ /* your conditions here */ });
const batchSize = 100;
function mergeAllReducer( accumulator, currentValue ) {
return accumulator.concat( currentValue );
}
query.count().then( total => {
let skip = 0;
const allQueries = [];
while ( skip < total ) {
allQueries.push( query.find()
.skip( skip )
.limit( batchSize )
.populate({ path: 'tvShows', populate: { path: 'views' }})
);
skip += batchSize;
}
return Promise.all( allQueries );
})
.then( arrayOfArrays => arrayOfArrays.reduce( mergeAllReducer, [] ))
.then( result => {
// do something with your populated result
});
请注意,您仍然需要处理所有正在使用的内存,并且您的javascript数组大小可能仍然比VM可以处理的大,因此您可以尝试批量处理,而不是使用整个阵列。