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で行うことができます. 私の質問は、それがどのように機能するかです。

populate を使用するのが最善の方法ですか? ただし、スキーマはそのままにしておきたいと思います。

4

1 に答える 1

1

ここでは、スキーマの設計が問題だと思います。ページが別のスキーマであるのはなぜですか? Pageで配列を作成するには、Mongo の埋め込み機能を使用する必要がありますBook

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

次に、ページ #N を持つ本を検索できます。

さらに、ページがページ番号と関連する本にすぎない場合は、ページを合計ページ数を表す番号にすることができます。

編集:そのようなスキーマがユースケースの単純化に過ぎず、実際に埋め込みができない場合は、運が悪いです。あなたが探している抽象化は結合と呼ばれ、Mongo はそれをサポートしていません。Mongo が目指しているものではないからです。それが本当にあなたの主要なユースケースである場合は、リレーショナル データベースの使用を検討する必要があります (またはスキーマを変更します)。

于 2015-11-24T14:47:46.970 に答える