假设我有一个具有以下架构的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
的索引(查询尚未返回)。
有什么想法吗? 这似乎是一个非常简单的问题,但我还没有找到任何解决方案。 希望你们能帮忙。
答案 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()
提供了skip
和limit
个选项,其中skip
设置为先前提取的id3
索引。最后调用execPopulate()
来返回一个Promise,当满足时将返回填充的book
文档。