MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Es gibt eine Möglichkeit, die referenzielle Integrität in MongoDB zu erzwingen

In Bezug auf die referenzielle Integrität bei Löschvorgängen, vorausgesetzt, dass alle Löschanforderungen von Ihrer Anwendung bedient werden, können sie vor dem Löschen von Datensätzen bearbeitet werden, indem überprüft wird, ob die ID in verwandten Sammlungen nicht vorhanden ist. Ich mache das wie folgt

CRUD-Operationen (Wir beschäftigen uns hier nur mit dem Löschen - beachten Sie, wie ich ein Array von Objekten übergebe, die die Sammlung und das Feld sind, das mit der ID des Dokuments (Datensatzes) abgeglichen werden muss, das wir löschen.

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 Handler Dies ist ein allgemeiner Löschanforderungs-Handler, den ich für CRUD-Operationen verwende. Ich übergebe ein Array von Sammlungs-/Feldwerten und überprüfe, ob es einen einzelnen Datensatz gibt, der mit der ID des zu löschenden Dokuments übereinstimmt.

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