7

Mongoose 3.x を使用してツリー構造 (Mongo のドキュメントにあるものと同様) の実装に取り​​組んでいますが、特定のノードをその兄弟や祖先と共にロードするためのすべてのロジックをカプセル化する最善の方法がわかりません。 、具体的には、ref が ref-er と同じコレクションにある場合に、population 機能を最適に使用する方法について説明します。

いくつかのコンテキストでは、私が扱っているツリーは、ノードが編集されていないが、新しい子が任意のノードにいつでも追加される可能性があるツリーです。これまでのところ、最初の検索後にオブジェクトをロードする一連のモデル メソッドでこれがうまく機能していますが、単一のブランチで必要なすべての親と兄弟のデータを単一のブランチに簡単にロードするより良い方法があるはずですコントローラーでコマンドを実行し、関連するすべての母集団をモデルの便利な検索メソッドにカプセル化します。

私が使用しようとしている基本的なスキーマは、次のようなものかもしれません (ここでも入手可能です: https://gist.github.com/3889616 ):

// Sub-document to store parent ref along with it's value (a form of caching)
var Parent = new Schema({
    id: ObjectId
  , text: String
});

// Main tree-node element schema
var Branch = new Schema({
    text: {
        type: String
      , required: true }
  , date: {type: Date, default: Date.now }
  , trail: [Parent]
  , parentBranchId: ObjectId
  , parentBranch: { type: Schema.Types.ObjectId, ref: 'Branch' }
  , _children: [{type: Schema.Types.ObjectId, ref: 'Branch'}]
  // These two have been commented out because I have no clue how to best implement 
  // , _priorSiblings: { type: Schema.Types.ObjectId, ref: 'Branch' }
  // , _followingSiblings: { type: Schema.Types.ObjectId, ref: 'Branch' }
});

私の希望は、次のコードのようなものを介して関連する関連データを含むブランチをロードできることですが、この時点で私はほとんど迷っており、ベースからかなり離れている可能性があります:

  req.app.models.Branch
    .findById(req.param("id"))
    .populate("parentBranch")
    .populate("parentBranch._children")
    .exec(...)

最終的には、Mongoose の「ツリー」プラグインに抽象化できる何かが欲しいのですが、まずこれを正しく設計する必要があると思います。何か案は?

FWIW、結局のところ、各ブランチに本当に必要なデータは、親、次の兄弟、前の兄弟 (両方の作成時間の観点から)、および親のすべての子です。

前もって感謝します!

4

1 に答える 1