MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Il existe un moyen d'appliquer l'intégrité référentielle dans MongoDB

En ce qui concerne l'intégrité référentielle sur les suppressions, à condition que toutes les demandes de suppression soient traitées par votre application, elles peuvent être traitées en vérifiant que l'ID n'existe pas dans les collections associées avant de supprimer les enregistrements. Je le fais comme suit

Opérations CRUD (Nous ne sommes concernés que par la suppression ici - notez comment je transmets un tableau d'objets étant la collection et le champ qui doivent être mis en correspondance avec l'ID du document (enregistrement) que nous supprimons

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

CRUD Delete HandlerIl s'agit d'un gestionnaire de demande de suppression générique que j'utilise pour les opérations CRUDJe passe un tableau de valeurs Collection / Field et vérifie s'il existe un seul enregistrement qui correspond à l'ID du document en cours de suppression.

// 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)
    }
  })
}