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