如何在填充时使用mongoose返回文档内容数组

时间:2015-11-24 14:27:24

标签: node.js mongodb mongoose mongoose-populate

我们假设我有像这样的书籍和页面的猫鼬模型:

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 个答案:

答案 0 :(得分:1)

我认为您的架构设计是问题所在。为什么页面是一个单独的模式?你应该使用Mongo的嵌入功能在Page中使Book成为一个数组:

mongoose.model("Book", new Schema({
    title: String,
    pages: [...]
});

然后,您可以搜索包含页面#N。

的图书

此外,如果您的网页只是一个页码和一个关联的书籍,您只需将页面设为一个代表总页数的数字。

编辑:如果这样的架构只是你的用例的简化,并且你真的不能嵌入,那么你就不走运了。你寻找的抽象被称为连接,而Mongo不支持它,因为它不是Mongo的用途。如果这确实是您的主要用例,您应该使用关系数据库(或更改您的架构)。