使用Mongoose Populate

时间:2017-12-11 00:45:03

标签: node.js mongodb mongoose

我正在进行一个非常大的Mongoose调用嵌套填充,然后对数据进行一些处理。

但是,由于嵌套的填充调用,我对Mongoose中的BSON文档达到了16MB的限制。

有什么可靠的方法?

let allDocuments = await exampleModel.find({
    condition: true
  }).populate({path: 'tvShows', populate: {path: 'views'}});

enter image description here

也许我可以闯入多个电话?但我不确定这样做的合理方式。感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用skiplimit查询参数实现自己的分页

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可以处理的大,因此您可以尝试批量处理,而不是使用整个阵列。