2016-03-22 12 views
2

したがって、私はNodeに小さなブログのようなプロジェクトを構築しています。孤立したデータベース参照に関する問題が発生しています。私はお互いを参照する別々のファイルに2つのモデルを持っています。MongoDBの孤立した参照を正しく削除する方法は?

ここでは私のモデルがあります:あなたは、言う投稿を削除する場合

// ./models/user 
Var UserSchema = mongoose.Schema({ 
    name: String, 
    posts: [{type: mongoose.SchemaTypes.ObjectId, ref:'Post'}] 
}); 

// ./models/post 
var PostSchema = mongoose.Schema({ 
    title:String, 
    post_body: String, 
    posted_by: mongoose.SchemaTypes.ObjectId 
}); 

私の質問は、どのようにユーザーのポスト配列内の参照を削除しますか?私は、削除ルートの前に実行するミドルウェアを作成し、実際に投稿を削除する前にユーザーの投稿配列内の参照を削除することができたと考えました。それはそれについての最善の方法と考えられるでしょうか?私はこのようなスキーマに「前」関数を使用してスタック上のポストを見つけました:Automatically remove referencing objects on deletion in MongoDB:ここ

// ./models/post 
PostSchema.pre('remove', function(next){ 
    this.model('User').remove({posts: this._id}, next); 
}); 

は、実際のスタックポストです。私はこの仕事を得ることができませんでした。私は、しかし、参照を削除するカスタムミドルウェアを実装しましたが、ベストプラクティスではないかもしれないと感じます。すべてのヒント/アドバイスは非常に高く評価されます。ありがとう!

答えて

2

現在地.remove()したくないが、あなたの代わりに$pull.update()をしたい:

配列から何かを削除するには、正しい操作です
PostSchema.pre('update',function(next) { 
    this.model('User').update(
     { }, 
     { "$pull": { "posts": this._id } }, 
     { "multi": true }, 
     next 
    ); 
}) 

。 "マルチ"は、それを参照するすべてのUserオブジェクトに対して "投稿"が削除されることを確実にします。とにかく本当に1つの文書だと思っていました。

.remove()の方法は、ドキュメント全体を「削除する」ためのものです。 .update()メソッドは、ドキュメントを「変更」します。

+0

私はそれを考えなかったとは思えません。アップデートを使用すると、ここでは完全に意味をなさないそれを感謝します。さて、あなたが投稿した小さなスニペットを試しましたが、オブジェクトIdはユーザーの投稿配列の中に残ります。 pre関数では、 'PostSchema.pre( 'update' ...'と 'PostSchema.pre( 'remove' ...')の両方を使用しましたが、参照の削除はありません。 – elloM8

+0

私はそれを動作させました。ドキュメントに記載されているように、 '削除'フックを設定すると、MyModel.remove()を呼び出すときではなく、myDoc.remove()を呼び出すときに呼び出されます。あなたの助けに感謝します。これは私が以前行っていたことよりもはるかにクリーンです。 – elloM8

関連する問題