sql >> Base de Datos >  >> NoSQL >> MongoDB

Hay una manera de hacer cumplir la integridad referencial en MongoDB

En relación con la integridad referencial en las eliminaciones, siempre que su aplicación atienda todas las solicitudes de eliminación, se puede manejar verificando que la identificación no exista en las colecciones relacionadas antes de eliminar los registros. Hago esto de la siguiente manera

Operaciones CRUD (aquí solo nos preocupa Eliminar; observe cómo estoy pasando una matriz de objetos que son la colección y el campo que deben coincidir con la ID del documento (registro) que estamos eliminando

const express = require('express')
const router = express.Router()
const iflexCRUD = require('../../lib/iflexCRUD')

const { UnitType } = require('../../models/Unittype')
const { Unit } = require('../../models/Unit')

iflexCRUD.create(router, '/', UnitType)
iflexCRUD.read(router, '/', UnitType, { sort: 'name' })
iflexCRUD.update(router, '/:id', UnitType)
iflexCRUD.deleteByID(router, '/:id', UnitType, [
  {
    model: Unit,
    field: 'unittype'
  }
])
iflexCRUD.delete(router, '/unittype/:unittype', UnitType)

module.exports = router

Controlador de eliminación CRUDEste es un controlador de solicitud de eliminación genérico que utilizo para operaciones CRUD. Paso una matriz de valores de colección/campo y verifico si hay un solo registro que coincida con la ID del documento que se está eliminando.

// CRUD-DELETE
iflexCRUD.deleteByID = (router, route, Collection, refs = []) => {
  router.delete(route, async (req, res) => {
    try {
      let exception = false
      //Enforce Referential Integrity for deletes - Deny when ID is used in any of refs collections
      //Loop through any referenced files (first record) to ensure there are no other collections using this document
      for (let i = 0; i < refs.length; i++) {
        if (!exception) {
          let refObj = {}
          refObj[refs[0].field] = req.params.id
          const result = await refs[i].model.findOne(refObj, (err, rec) => {})
          exception = result !== null
        }
      }
      // Process deletion of there are no exceptions
      if (!exception) {
        const doc = await Collection.deleteOne({ _id: req.params.id })
        res.send(doc)
      } else {
        return res
          .status(401)
          .json(
            'Document is already use in related collection  - it cannot Delete!'
          )
      }
    } catch (e) {
      return res.status(401).json(e.message)
    }
  })
}