我们假设我有像这样的书籍和页面的猫鼬模型:
mongoose.model("Book", new Schema({
title: String
});
和这个
mongoose.model("Page", new Schema({
pageNumber: Number,
_bookId: {type: ObjectId, ref: "Book"}
});
每个页面都会跟踪它所属的书籍。现在我想要一个包含pageNumber 500页面的书籍数组。
我可以做以下事情:
Page.find({pageNumber: 500})
.populate("_bookId")
.then(function (pages) {
var books = [];
pages.forEach(function (page) {
books.push(page._bookId); // page._bookId now contains a Book document
});
return q(books);
}).then(function (books) {
// Do something with the books
});
然而,我在页面上循环的部分看起来很麻烦,那种提取可能是由mongo完成的。我的问题是如何运作。
使用填充甚至最好的方式去这里? 我想按照它们的方式保留模式。
答案 0 :(得分:1)
我认为您的架构设计是问题所在。为什么页面是一个单独的模式?你应该使用Mongo的嵌入功能在Page
中使Book
成为一个数组:
mongoose.model("Book", new Schema({
title: String,
pages: [...]
});
然后,您可以搜索包含页面#N。
的图书此外,如果您的网页只是一个页码和一个关联的书籍,您只需将页面设为一个代表总页数的数字。
编辑:如果这样的架构只是你的用例的简化,并且你真的不能嵌入,那么你就不走运了。你寻找的抽象被称为连接,而Mongo不支持它,因为它不是Mongo的用途。如果这确实是您的主要用例,您应该使用关系数据库(或更改您的架构)。