8

二重にリンクされている多数のドキュメントを保存しようとしています。つまり、前任者と後任者を持つことができます。コレクションにはさまざまなドキュメントが存在するため、実行可能なインデックスを作成できるかどうかわかりません。

{"_id": "1234", "title": "Document1", "content":"...", "next": "1236"}
{"_id": "1235", "title": "Document2", "content":"...", "next": "1238"}
{"_id": "1236", "title": "Document1a", "content":"...", "prev": "1234"}
{"_id": "1237", "title": "Document2a", "content":"...", "prev": "1235", "next": "1238"}
{"_id": "1238", "title": "Document2b", "content":"...", "prev": "1237", "next": "1239"}
...

前のドキュメントと次のドキュメントを含むドキュメントの「履歴」全体が必要になるため、リストのサイズに応じて多数のクエリを実行する必要があると思いますか?

パフォーマンスの高いインデックスを作成する方法について何か提案はありますか? 二重リンク リストを格納するための別の構造も興味深いでしょう。

4

1 に答える 1

9

読み取りを最適化したい場合は、配列を使用して前のドキュメントと次のドキュメントを保存できます。

{
    "_id": "1237", 
    "title": "Document1", 
    "content":"...", 
    "next": "1238",
    "prev": "1235",
    "parents" : [1000, 1235]
    "children" : [1238, 1239]
}

その後、_id が子配列または親配列のいずれかにあるすべてのドキュメントを取得できます。このソリューションは、ドキュメントの親または子のみが必要な場合に適しています。リスト全体を取得するために、$or と 2 つの $in 演算子でインデックスを効率的に使用することはできません。

別の、おそらくより良い解決策は、各ドキュメントのリスト全体、つまり子と親を 1 つの配列に格納することです。

{
    "_id": "1237", 
    "title": "Document1", 
    "content":"...", 
    "next": "1238",
    "prev": "1235",
    "list_ids" : [1000, 1235, 1238, 1239, 1237]
}

そうすれば、インデックスを作成してlist_ids、高速な単純な $in クエリですべてのドキュメントを取得できます。

両方のソリューションの問題は、新しいドキュメントを追加するときに、関連するすべてのドキュメントを更新する必要があることです。したがって、書き込みの多いアプリを作成する場合、これはおそらく良い解決策ではありません。

于 2013-10-31T09:31:02.363 に答える