2012-08-10 13 views
19

Supongamos que tengo un esquema como éste:eliminar automáticamente referencia a los objetos de supresión en MongoDB

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

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

Si elimino una persona, no puede asignaciones todavía ser huérfanos izquierda que hace referencia a una persona que no existe, lo cual crea desorden extraños en la base de datos.

¿Existe una manera simple de garantizar que cuando se elimine a una persona, todas las referencias correspondientes a esa persona también se eliminarán?

Respuesta

26

Puede agregar su propio 'remove' Mongoose middleware en el esquema Person para eliminar esa persona de todos los demás documentos que hacen referencia a ella. En su función de middleware, this es el documento Person que se está eliminando.

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

¿Qué ocurre si contiene una matriz más anidada de identificadores de objeto? como 'data: {personas: [{ObjectID}]}'? – vhflat

+0

@vhflat Probablemente sea mejor publicar una nueva pregunta sobre eso con todos los detalles. – JohnnyHK

+0

@JohnnyHK, pero ¿qué pasa con la concurrencia? ¿Qué ocurre si se está creando una tarea mientras se está eliminando? Traté de resolver este problema en mi respuesta a esta pregunta http://stackoverflow.com/q/42521550, pero creo que debe haber una manera mejor. ¿Puedes comprobarlo? –

8

Si con "simple" quiere decir "incorporado", entonces no. MongoDB no es una base de datos relacional después de todo. Necesita implementar su propio mecanismo de limpieza.

0

puede utilizar la eliminación suave. No elimine la persona de la Colección de personas en su lugar use isDelete indicador booleano en verdadero.

Cuestiones relacionadas