MongoDB和Mongoose:如何在refs数组的特定索引处开始填充子文档?

时间:2017-05-10 00:36:55

标签: mongodb mongoose

假设我有一个具有以下架构的Book模型:

// Book schema
var bookSchema = new Schema({
  pages: [{
    type: Schema.Types.ObjectId,
    ref: 'Page' // ref to Page model
  }]
});

我有一份book文件

book.pages === [id1, id2, id3, id4, id5];

问题是我想从book.pages开始填充id3,每个查询填充两个子文档的限制。

我想这个查询会是这样的:

// Query
Book.findById(book._id).populate({
  path: 'pages',
  options: { 
    skip: elementsToSkip,
    limit: 2
  }
}).exec(function(err) {})

要跳过的元素是

返回的数字
var elementsToSkip = book.pages.indexOf(id3);

这里的问题是我需要从id3中提取感兴趣的元素book.pages的索引(查询尚未返回)。

有什么想法吗? 这似乎是一个非常简单的问题,但我还没有找到任何解决方案。 希望你们能帮忙。

2 个答案:

答案 0 :(得分:0)

试试这个

// Query
Book.findById(book._id).populate({
  path: 'pages',
  // Start at index of id3 in pages array
  .slice('book.pages', 2)
  options: { limit: 2 }
}).exec(function(err) {})

答案 1 :(得分:0)

我最终做的是以下(我正在与Promises合作,顺便说一句):

// Query
Book.findById(book._id).exec().then(function(book) {
  // Once Book.findById() is fulfilled with book doc
  var toSkip = book.posts.indexOf(id3);
  return book.populate({
    path: 'pages',
    options: {
      skip: toSkip,
      limit: 2
    }
  }).execPopulate().then(function() {
    // Do something cool
  }); 
})
.catch();

完成Book.findById()查询后,将访问返回的文档以提取indexOf数组中的id3 book.pages。然后,book.populate()提供了skiplimit个选项,其中skip设置为先前提取的id3索引。最后调用execPopulate()来返回一个Promise,当满足时将返回填充的book文档。