2017-01-05 5 views
0

私はWebアプリケーションを構築しています。関連ドキュメント間の更新を世話するために長い時間をかけています。投稿とコメントとの間のMongoDB自動更新

例えば、私は、「タスク」ドキュメントおよび「ユーザー」の文書を持っています。タスクが作成されると、複数のユーザーが割り当てられます。従って、

taskA.assigned = ["1321231fsdfsdf"(userA's _id), "12312313asdasdasd"(userB's _id)] 
userA.tasks = [..., "1231321"(taskA's _id),...] 
userB.tasks = [..., "12313211"(taskB's _id),...] 

タスクを作成するだけでは、私はそれをうまく処理できます。しかし、私はタスクを編集しようとするとあまりにも厄介になります。ユーザーBをtaskAから削除すると、userBのIDを削除してuserBのタスクプロパティに移動し、taskAのIDも削除する必要があります。

これに対処するためのショートカットと自動の方法はありますか?読んでいただきありがとうございます。私があまりにも漠然としているかどうかを教えてください、私は詳細を追加します。外部キーとカスケード更新を使用してMySQLなどのリレーショナルデータベースで

+0

あなたの問題はデータベースの設計方法にあります。重複した値を別の文書に保存することを選択します。これはデータベースからの読み込みを速くするのに役立ちますが、書き込み時には一貫性を保つために注意する必要があります。コレクション間に関係がある場合は、今のような書き込み操作が面倒かもしれません。 これを解決するには、コレクション間の関係でデータベース構造を再設計することが考えられます。 – Khang

+0

@Khangええ、それは私が正確に感じたものです。私は自分が行ったことで何かが間違っていることを知っています。それから、私は今何をすべきか?ところで、私が覚えている限り、私がmysqlを使用していたとき、この問題を処理する非常に便利な方法がありました。投稿とコメントとの関係を作るなど、投稿が削除された場合、その投稿に関連するすべてのコメントも一緒に削除されます。私はmongodbが同じ機能を持っているかどうかを調べていましたが、私はそれについて懐疑的です。モンゴブでこれを行う方法を知っている人はいますか? – supergentle

答えて

-1

コードの行数を減らして簡単にこれを行う方法が見つかりました。これを行うことで約100行が約30行に減少しました。こうした中$、$のプッシュ、または$引くよう

かいつまんで、私が使用した「更新()」メソッドと様々なモンゴ演算子、。ここで

はupdateメソッドを使用して最適化されて、私の最後のコードです。

var edit = req.body; 
edit.assignedTo = edit.assignedTo.split(','); 
var old = req.task; 
var idQueries = edit.assignedTo.map(function (x) { 
return mongoose.Types.ObjectId(x); 
}); 
User.update({tasks: old._id}, {$pull: {tasks: old._id}}, {multi: true}, function() { 
// Update to remove original task's id from users assigned to it. 
User.update({_id: {$in: idQueries}}, {$push: {tasks: old._id}}, {multi: true}, function() { 
    // Update to add edited tasks'id to new users assigned to it. 
    old.lastAction = 'edited'; 
    old.edited = true; 
    old.editedAt = Date.now(); 
    old.titke = edit.title; 
    old.desc = edit.desc; 
    old.dueBy = edit.dueBy; 
    old.assignedTo = edit.assignedTo; 
    old.save(function (err, task) { 
    if (err) return next(err); 
    User.populate(task, 'assignedTo', function (err, task) { 
    res.json(task); 
    }); 
    }); 
}); 
}); 

これは一部の人に役立ちます。

1

は自動的に行わが、MongoDBのは不可能だということでした。

は、しかし、私はそうトリックを行うことができpost save hookを使用して、あなたはMoongoseを使用しているタグで参照してください。タスクが更新されるたびに自動的にユーザーコレクションを更新するフックを設定できます。


その他のオプションは、あなたのデータestructureを変更することになるが、これはあなたのケースに依存し、考慮に入れるべきいくつかの事実があります。私は判断するのに十分な情報がないと思っていますが、MongoDBのデータ正規化について話す多くのリソースがあります。たとえば、公式MongoDB manualを確認できます。

+0

私はmongodbを使い方を慎重に研究することなく選択したような気がします。私はかなりmysqlは私のプロジェクトのためのより良い選択だと確信しています...ところで、あなたの答えに感謝します。それは私に多くの理解を助けました。 – supergentle

関連する問題