3

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

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 完成。我的问题是这将如何工作。

使用填充甚至是最好的方法吗?我想保持模式不变。

4

1 回答 1

1

我认为您的架构设计是这里的问题。为什么页面是一个单独的架构?您应该使用 Mongo 的嵌入功能在以下位置创建Page一个数组Book

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

然后您可以搜索具有第 #N 页的书籍。

此外,如果您的页面只不过是页码和相关书籍,您可以将 pages 设为代表总页数的数字。

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

于 2015-11-24T14:47:46.970 回答