2016-12-19 5 views
0

をクリーンアップします。ユーザーが「タグ」と呼ばれる配列がある場合はマングースの移入と死んで参照()

var User = new Schema({ 
    email: { 
     type: String, 
     unique: true, 
     required: true 
    }, 
    tags: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref:'Tag', 
     required: true 
    }], 
    created: { 
     type: Date, 
     default: Date.now 
    } 
}); 

を、私は、クエリの移入(「タグ」)を実行します。

User.findById(req.params.id) 
    .populate("tags") 
    .exec(function(err, user) { ... }); 

リスト内のいずれかのタグが実際に削除されている場合、この「参照」を「タグ」で削除する方法はありますか?

現在、返されたユーザオブジェクトは、の結果を返します。実際に存在するタグだけがtags配列内にあります...しかし、mongodbの基礎となるドキュメントを見ると、まだ配列内にdead tag idが入っています。

理想的には、これらの参照を遅延して削除したいと考えています。誰もがこれを行うための良い戦略を知っていますか?

答えて

1

私はこれを行うための組み込み方法を見つけようとしましたが、そのような機能を提供していないようです。

だから私はあなたがまた文書から死んでレフリーを削除するユーザーをフェッチするたびに、この

User.findById(userId) 
    .populate('tags') 
    .exec((err, user) => { 
     user.tags = user.tags.filter(tag => tag != null); 

     res.send(user); // Return result as soon as you can 
     user.save(); // Save user without dead refs to database 
    }) 

この道のような何かをしました。また、削除された参照がなかった場合はisUpdatedブール変数を作成してuser.saveを呼び出さないようにすることができます。

0

これらのタグをmongooseで削除すると仮定すると、投稿ミドルウェアを使用できます。

これは、タグを削除した後に実行されます。

tagSchema.post('remove', function(doc) { 
    //find all users with referenced tag 
    //remove doc._id from array 
}); 
+0

削除時に各ユーザーからタグを削除する必要はありません。ユーザーが次にフェッチされたときに値を設定します。 – Garett

+0

@ガレットしかし、なぜですか? – Camo

+0

私は、何百万人ものタグを付けられたユーザーがいるデータベースを持っています。タグがシステムから削除されるたびに時間をかけて浄化される一時的な参照が残っています。 – Garett

関連する問題