2012-01-20 9 views
0

「Projects」と「Tasks」の2種類のMongoDB文書があります。プロジェクトには多くのタスクがあります。私の場合は、埋め込むよりも文書をリンクする方が適しています。MongoDB:参照されている文書がまだ存在することを確認する

// Create new task 
var task = new Task(data); 
// Make sure project exists 
Project.findById(task.project, function(err, project) { 
    if(project) { 
    // If project exists, save task 
    task.save(function(err){ 
     ...  
    }); 
    } else { 
    // Project not found 
    } 
}); 

私の関心別のユーザーが後にプロジェクトを削除するために発生した場合ということですので、は次のように、ユーザは、私が最初のプロジェクトは、タスクが存在するために割り当てられていることを確認したタスクを保存したい

Project.findById()クエリが実行されますが、タスクが保存される前に、タスクは参照プロジェクトなしで作成されます。

これは有効な懸念事項ですか?これが起こらないようにする練習はありますか、それともMongoDBに直面しなければならないことでしょうか?

答えて

0

技術的には、これはMongoDBを使用する際に直面する必要があります。しかし、それは本当に大きな問題ではありません。誰かがプロジェクトを削除することはめったになく、他の人はそれを知らずに、そのプロジェクトのタスクを作成しているからです。私はifステートメントを使用してプロジェクトの状態をチェックするのではなく、タスクを悪いレコードとして作成したままにしておきます。これらの不良レコードを手動で削除するか、クリーンタスクをスケジュールしてクリーンタスクをクリーンアップすることができます。

+0

意味があります。私はcronの仕事の考えが好きです。 –

0

2つのモデル(サブモデルではなく、モデルを見ずにわかりにくい)を使用しているように見えますが、競合状態になると思います。 ifは役に立ちません。この問題を避けるためには、モディファイアを使う必要があります。別のモデル(それぞれMongoDBのコレクション)を使用すると、atomic modifiers are not availableを使用する必要があります。 SQL世界では、一貫性を保証するためにトランザクションを使用します。同様に、MongoDBのようなドキュメントストアでは、各タスクをプロジェクトのサブドキュメントにしてから、.push()新しいタスクだけを作成します。しかし、おそらくあなたのユースケースは、別々の無関係のモデルを必要とします。 MongoDBはその柔軟性を提供するのに最適ですが、SQLを使わずにSQLの考え方を保持できるため、設計上の問題が発生する可能性があります。

さらに、あなたが心配しているレースコンディションは大したことではないようです。結局のところ、プロジェクトは、タスクが保存された後にも削除される可能性があります。あなたは明らかにそれを浄化する方法を持っています。もう1つのクリーンアップ機能は、世界の終わりではありません。とにかくバックポケットに入れておくとよいでしょう。