当填充涉及猫鼬时如何返回文档内容数组
Posted
技术标签:
【中文标题】当填充涉及猫鼬时如何返回文档内容数组【英文标题】:How to return an array of document contents when populate is involved with mongoose 【发布时间】:2016-02-27 01:02:11 【问题描述】:假设我有这样的书籍和页面的猫鼬模型:
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 完成。我的问题是这将如何运作。
使用填充是最好的方法吗? 我想保持模式不变。
【问题讨论】:
【参考方案1】:我认为您的架构设计是这里的问题。为什么页面是一个单独的架构?您应该使用 Mongo 的嵌入功能使 Page
成为 Book
中的数组:
mongoose.model("Book", new Schema(
title: String,
pages: [...]
);
然后你就可以搜索有#N页的书了。
此外,如果您的页面只不过是页码和相关书籍,您可以将 pages 设置为代表总页数的数字。
编辑:如果这样的模式只是您的用例的简化,而您真的不能进行嵌入,那么您就不走运了。您寻找的抽象称为连接,Mongo 不支持它,因为它不是 Mongo 想要的。如果这确实是您的主要用例,您应该考虑使用关系数据库(或更改您的架构)。
【讨论】:
感谢您的回答。以上只是一个例子,实际上我使用的是更复杂的模式。我不使用嵌入式模式是有原因的,但在这里我正在寻找一种更好的方法来处理这种模式。如果无法以简洁的方式完成上述操作是架构设计的固有限制,那很好,我只是想知道这是否属实。 @Florian 在这种情况下,你就不走运了。您寻找的抽象称为连接,Mongo 不支持它,因为它不是 Mongo 想要的。如果这确实是您的主要用例,您应该考虑使用关系数据库(或更改您的架构)。以上是关于当填充涉及猫鼬时如何返回文档内容数组的主要内容,如果未能解决你的问题,请参考以下文章