복붙노트

[MONGODB] 자동으로 MongoDB를에서 삭제의 개체를 참조 제거

MONGODB

자동으로 MongoDB를에서 삭제의 개체를 참조 제거

하자 내가이 같은 스키마가 있다고 가정합니다 :

var Person = new Schema({
    name: String
});

var Assignment = new Schema({
    name: String,
    person: ObjectID
});

나는 사람을 삭제하면, 아직 거기에 고아가 될 수있다 할당은 해당 참조를 데이터베이스에 불필요한 혼란을 만들고 존재하지 않는 사람을 떠났다.

사람이 삭제 될 때, 그 사람에 대한 모든 해당 참조도 삭제 될 수 있도록하는 간단한 방법이 있나요?

해결법

  1. ==============================

    1.당신은 그것을 참조하는 모든 다른 문서에서 그 사람을 제거하는 사람이 스키마에 자신의 '제거'몽구스 미들웨어를 추가 할 수 있습니다. 미들웨어 기능,이 제거되고있는 사용자 문서입니다.

    당신은 그것을 참조하는 모든 다른 문서에서 그 사람을 제거하는 사람이 스키마에 자신의 '제거'몽구스 미들웨어를 추가 할 수 있습니다. 미들웨어 기능,이 제거되고있는 사용자 문서입니다.

    Person.pre('remove', function(next) {
        // Remove all the assignment docs that reference the removed person.
        this.model('Assignment').remove({ person: this._id }, next);
    });
    
  2. ==============================

    2."간단한"에 의해 뜻이 "내장하지-에서"다음 더. MongoDB의 모든 후 관계형 데이터베이스가 아닙니다. 당신은 당신의 자신의 청소 메커니즘을 구현해야합니다.

    "간단한"에 의해 뜻이 "내장하지-에서"다음 더. MongoDB의 모든 후 관계형 데이터베이스가 아닙니다. 당신은 당신의 자신의 청소 메커니즘을 구현해야합니다.

  3. ==============================

    3.당신의 몽구스 미들웨어에서 '제거'를 사용 그래서 더 이상 아마 가장 좋은 방법이 아닙니다.

    당신의 몽구스 미들웨어에서 '제거'를 사용 그래서 더 이상 아마 가장 좋은 방법이 아닙니다.

    몽구스는 deleteMany ()와 deleteOne에 대한 후크를 제공하기 위해 업데이트를 만들었습니다 (). 당신은 그 대신 수 있습니다.

    Person.pre('deleteMany', function(next) {
        var person = this;
        person.model('Assignment').deleteOne({ person: person._id }, next);
    });
    
  4. ==============================

    4.당신은 부드러운 사용 삭제할 수 있습니다. 사람 컬렉션에서하지 마십시오 삭제 사람 대신 true로 isDelete 부울 플래그를 사용합니다.

    당신은 부드러운 사용 삭제할 수 있습니다. 사람 컬렉션에서하지 마십시오 삭제 사람 대신 true로 isDelete 부울 플래그를 사용합니다.

  5. ==============================

    5.경우 사전 훅하지만 deleteOne 및 deleteMany 기능을 찾는 사람이 나를 위해 작동하는 솔루션 인 경우 :

    경우 사전 훅하지만 deleteOne 및 deleteMany 기능을 찾는 사람이 나를 위해 작동하는 솔루션 인 경우 :

    const mongoose = require('mongoose');
    ... 
    
    const PersonSchema = new mongoose.Schema({
      name: {type: String},
      assignments: [{type: mongoose.Schema.Types.ObjectId, ref: 'Assignment'}]
    });
    
    mongoose.model('Person', PersonSchema);
    
    .... 
    
    const AssignmentSchema = new mongoose.Schema({
      name: {type: String},
      person: {type: mongoose.Schema.Types.ObjectId, ref: 'Person'}
    });
    
    mongoose.model('Assignment', AssignmentSchema)
    ...
    
    PersonSchema.pre('deleteOne', function (next) {
      const personId = this.getQuery()["_id"];
      mongoose.model("Assignment").deleteMany({'person': personId}, function (err, result) {
        if (err) {
          console.log(`[error] ${err}`);
          next(err);
        } else {
          console.log('success');
          next();
        }
      });
    });
    

    서비스 어딘가에 deleteOne 함수를 호출 :

    try {
      const deleted = await Person.deleteOne({_id: id});
    } catch(e) {
      console.error(`[error] ${e}`);
      throw Error('Error occurred while deleting Person');
    }
    
  6. from https://stackoverflow.com/questions/11904159/automatically-remove-referencing-objects-on-deletion-in-mongodb by cc-by-sa and MIT license