2016-10-31 5 views
0
にサブ文書の配列を使用する

..私はちょうどマングースを学んだ、と次のように私はParentChild文書をモデル化してきた私はParentは、私もすべて削除する削除 正しい方法はマングース

var parent = new Schema({ 
    children: [{ type: Schema.Types.ObjectId, ref: 'Child' }], 
}); 

var Parent = db.model('Parent', parent); 

var child = new Schema({ 
    _owner: { type: Schema.Types.ObjectId, ref: 'Parent' }, 
}); 

var Child = db.model('Child', child); 

childrenフィールドで参照されるオブジェクト Child StackOverflowの上 Another questionは、すべての子オブジェクトが削除されていることを確認する必要があり、どの

parent.pre('remove', function(next) { 
    Child.remove({_owner: this._id}).exec(); 
    next(); 
}); 

...親のpreミドルウェア機能は次のように書くことができると述べています。しかし、この場合、Parentスキーマにchildren配列を持つ理由はありますか?それを使わないで、作成/読み込み/更新/削除操作も実行できませんでしたか?たとえば、私はすべての子供が欲しいと思ったら私はできますか?

Child.find({_owner: user._id}).exec(function(err, results) { ... }; 

私はマングース「hasManyの」関係の見てきたすべての例は、しかし「子供のアレイを備えていますが、それは、その後どのように使用されるかを示していません。誰かが例を挙げたり、それを持つ目的を与えることはできますか?

答えて

1

は、さてあなたは、2つの異なるコレクション、子と親を定義している - >

var Parent = db.model('Parent', parent);

var Child = db.model('Child', child);

だから、あなたと子供モデルのユーザーに自由に追加/削除することによって、のような/更新。 「ref」として保存すると、次のことが可能になります。

Parent.find({_id:'idofparent'}) 
.populate('children') 
.exec((err, result) => { .... } ) 

あなたの親は子供で埋められます。

+0

ありがとうございます!だから私が理解している場合は、配列内の参照を保持することによって、子モデルのクエリで各子を取り出すのではなく、 'populate'を呼び出すことでそれらを取り出すことができます。しかし、それ以外には、子配列を維持する理由はありません。 – CSharp

+1

親がすべての子を取得したい場合、はい、人口はあなたのためのそれらのクエリを非常に便利です:) – raubas

+0

素晴らしい!説明をありがとう – CSharp