[MONGODB] 자동으로 MongoDB를에서 삭제의 개체를 참조 제거
MONGODB자동으로 MongoDB를에서 삭제의 개체를 참조 제거
하자 내가이 같은 스키마가 있다고 가정합니다 :
var Person = new Schema({
name: String
});
var Assignment = new Schema({
name: String,
person: ObjectID
});
나는 사람을 삭제하면, 아직 거기에 고아가 될 수있다 할당은 해당 참조를 데이터베이스에 불필요한 혼란을 만들고 존재하지 않는 사람을 떠났다.
사람이 삭제 될 때, 그 사람에 대한 모든 해당 참조도 삭제 될 수 있도록하는 간단한 방법이 있나요?
해결법
-
==============================
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."간단한"에 의해 뜻이 "내장하지-에서"다음 더. MongoDB의 모든 후 관계형 데이터베이스가 아닙니다. 당신은 당신의 자신의 청소 메커니즘을 구현해야합니다.
"간단한"에 의해 뜻이 "내장하지-에서"다음 더. MongoDB의 모든 후 관계형 데이터베이스가 아닙니다. 당신은 당신의 자신의 청소 메커니즘을 구현해야합니다.
-
==============================
3.당신의 몽구스 미들웨어에서 '제거'를 사용 그래서 더 이상 아마 가장 좋은 방법이 아닙니다.
당신의 몽구스 미들웨어에서 '제거'를 사용 그래서 더 이상 아마 가장 좋은 방법이 아닙니다.
몽구스는 deleteMany ()와 deleteOne에 대한 후크를 제공하기 위해 업데이트를 만들었습니다 (). 당신은 그 대신 수 있습니다.
Person.pre('deleteMany', function(next) { var person = this; person.model('Assignment').deleteOne({ person: person._id }, next); });
-
==============================
4.당신은 부드러운 사용 삭제할 수 있습니다. 사람 컬렉션에서하지 마십시오 삭제 사람 대신 true로 isDelete 부울 플래그를 사용합니다.
당신은 부드러운 사용 삭제할 수 있습니다. 사람 컬렉션에서하지 마십시오 삭제 사람 대신 true로 isDelete 부울 플래그를 사용합니다.
-
==============================
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'); }
from https://stackoverflow.com/questions/11904159/automatically-remove-referencing-objects-on-deletion-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 보관 UTC와 몽고에 현지 날짜 (0) | 2019.12.23 |
---|---|
[MONGODB] 어떻게 MongoDB를 하나 개의 컬렉션 자신의 문서를 주문 하는가? [복제] (0) | 2019.12.23 |
[MONGODB] MongoDB의 사용자 정의 개체 ID 만들기 (0) | 2019.12.23 |
[MONGODB] 어떻게 자바 MongoDB의 드라이버에서 "_id"필드를 사용하여 쿼리 문서? (0) | 2019.12.23 |
[MONGODB] mongoexport을 할 때 "너무 많은 위치 옵션"은 무엇을 의미합니까? (0) | 2019.12.23 |