当填充涉及猫鼬时如何返回文档内容数组

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 想要的。如果这确实是您的主要用例,您应该考虑使用关系数据库(或更改您的架构)。

以上是关于当填充涉及猫鼬时如何返回文档内容数组的主要内容,如果未能解决你的问题,请参考以下文章

使用猫鼬填充时返回一个空的帖子数组

推入数组猫鼬时对象对象而不是字符串

猫鼬填充返回空数组

如何填充新创建的猫鼬文档?

使用猫鼬时未定义Graphql错误newUser

如何在子文档中填充模型实例数组? MongoDB猫鼬