填充涉及猫鼬时如何return文档内容数组
How to return an array of document contents when populate is involved with mongoose
假设我有 mongo这样的书籍和页面模型:
mongoose.model("Book", new Schema({
title: String
});
还有这个
mongoose.model("Page", new Schema({
pageNumber: Number,
_bookId: {type: ObjectId, ref: "Book"}
});
每一页都记录它属于哪本书。现在我想要一个页面编号为 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 完成。我的问题是这将如何运作。
使用 populate 是到达此处的最佳方式吗?
不过,我想保持模式不变。
我认为您的架构设计是这里的问题所在。为什么页面是一个单独的模式?您应该使用 Mongo 的嵌入功能使 Page
成为 Book
中的数组:
mongoose.model("Book", new Schema({
title: String,
pages: [...]
});
然后您可以搜索第 #N 页的图书。
此外,如果您的页面只是一个页码和一本关联的书,您可以将页面设为一个代表总页数的数字。
编辑:如果这样的模式只是对您的用例的简化,而您确实无法进行嵌入,那您就倒霉了。您正在寻找的抽象称为连接,Mongo 不支持它,因为它不是 Mongo 想要的。如果这确实是您的主要用例,您应该考虑使用关系数据库(或更改架构)。
假设我有 mongo这样的书籍和页面模型:
mongoose.model("Book", new Schema({
title: String
});
还有这个
mongoose.model("Page", new Schema({
pageNumber: Number,
_bookId: {type: ObjectId, ref: "Book"}
});
每一页都记录它属于哪本书。现在我想要一个页面编号为 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 完成。我的问题是这将如何运作。
使用 populate 是到达此处的最佳方式吗? 不过,我想保持模式不变。
我认为您的架构设计是这里的问题所在。为什么页面是一个单独的模式?您应该使用 Mongo 的嵌入功能使 Page
成为 Book
中的数组:
mongoose.model("Book", new Schema({
title: String,
pages: [...]
});
然后您可以搜索第 #N 页的图书。
此外,如果您的页面只是一个页码和一本关联的书,您可以将页面设为一个代表总页数的数字。
编辑:如果这样的模式只是对您的用例的简化,而您确实无法进行嵌入,那您就倒霉了。您正在寻找的抽象称为连接,Mongo 不支持它,因为它不是 Mongo 想要的。如果这确实是您的主要用例,您应该考虑使用关系数据库(或更改架构)。