sql >> データベース >  >> NoSQL >> MongoDB

1対1および1対多の参照の削除-マングース

    関係:

    1. one-to-one is a relationship 州の首都は1つだけで、首都は1つの州の首都です
    2. one-to-many is a relationship 母親には多くの子供がいて、子供には母親が1人しかいないように
    3. many-to-many is a relationship 1冊の本を複数の著者または共著者が書くことができ、1人の著者が複数の本を書くことができるようにします。

    1対1の関係-Project/Groupの場合 が削除されました。Assignmentを更新するにはどうすればよいですか。 スキーマ。

    通常、1つのprojectがあります 1つのassignmentにマッピングされます 同様に、1つのassignment 1つのprojectにマッピングされています 。ここでできることは、プロジェクトを削除してから、関連するprojectを見つけることです。 割り当てモデルで、それらの参照を削除します。

    delete: function(req, res) {
       return Project.findById(req.params.id, function(err, project){
             return project.remove(function(err){
                 if(!err) {
                     Assignment.update({_id: project.assignment}}, 
                          {$pull: {projects: project._id}}, 
                              function (err, numberAffected) {
                                console.log(numberAffected);
                          } else {
                            console.log(err);                                      
                        }
                      });
                });
            });
    }
    

    1対多の関係-Project/Groupの場合 が削除されました。Assignmentを更新するにはどうすればよいですか。 スキーマ。

    このシナリオでは、プロジェクトを削除してから、すべてのassignmentを検索します。 このprojectに属します そしてそれらからその参照を削除します。ここでの状況は、1つのプロジェクトに多くの割り当てが存在する可能性があるということです。

    delete: function(req, res) {
       return Project.findById(req.params.id, function(err, project){
             return project.remove(function(err){
                 if(!err) {
                     Assignment.update({_id: {$in: project.assingments}}, 
                          {$pull: {project: project._id}}, 
                               function (err, numberAffected) {
                                console.log(numberAffected);
                          } else {
                            console.log(err);                                      
                        }
                      });
                });
            });
    }
    

    ミドルウェアを削除する

    middlewareでも同じことができます ジョニーが指摘したように、それを修正しただけです。

    ProjectSchema.pre('remove', function (next) {
        var project = this;
        project.model('Assignment').update(
            { projects: {$in: project.assignments}}, 
            { $pull: { project: project._id } }, 
            { multi: true }, 
            next
         );
    });
    

    通常、多くのprojectが存在する可能性があります assignmentに属する および多くのassignment 同じprojectに属する 。 assignmentがあります Projectの列 1つのプロジェクトが複数の割り当てに関連するスキーマ。

    注: ミドルウェアの削除はモデルでは機能せず、ドキュメントでのみ機能します。 removeを使用する場合 ミドルウェアは、削除機能でprojectを見つけることを確認します 最初にidで、次に返されたdocumentで removeメソッドを適用すると、上記が機能するようになります...削除機能は次のようになります。

    delete: function(req, res) {
       return Project.findById(req.params.id, function(err, project){
             return project.remove(function(err){
                 if(!err) {
                      console.log(numberAffected);
                 } 
               });                
        });
     }
    


    1. $slice演算子を使用して配列の最後の要素を取得する

    2. Redisセットの使用

    3. ZADDやHMGETなどのredisコマンドが処理できる引数の数に制限はありますか?

    4. ユーザー名とパスワードでMongoDBを保護する方法