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

Comment limiter la référence maximale du nœud parental dans mongodb

Si vous utilisez mongo version 3.6, vous pouvez activer la validation de schéma en utilisant $jsonSchema côté serveur

chaque document que nous mettons à jour/insérons sera validé par rapport au schéma de validation, si la validation échoue, une erreur sera générée et aucune modification ne sera apportée au document

exemple de node schéma de collecte

{
   _id : string,
   parent : [string, null],
   children : string[2]
}

schéma de validation

db.createCollection("node", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "_id" ],
         properties: {
            parent: {
               bsonType: ["string", "null"],
               description: "must be a string"
            },
            children: {
               bsonType: ["array"],
               items : { bsonType: ["string"] },
               minItems: 0,
               maxItems: 2,
               description: "must be a array of string and max is 2"
            }
         }
      }
   }
});

insère [avec des documents valides]

> db.node.insert( { _id: "Books", children: [ "Programming" ], parent: null } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "Programming", children: [ "Databases", "Languages" ], parent: "Books" } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "Languages", children: [ ], parent: "Programming" } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "Databases", children: [ "MongoDB", "dbm" ], parent: "Programming" } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "MongoDB", children: [ ], parent: "Databases" } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "dbm", children: [ ], parent: "Databases" } )
WriteResult({ "nInserted" : 1 })
> 

trouver

> db.node.find()
{ "_id" : "Books", "children" : [ "Programming" ], "parent" : null }
{ "_id" : "Programming", "children" : [ "Databases", "Languages" ], "parent" : "Books" }
{ "_id" : "Languages", "children" : [ ], "parent" : "Programming" }
{ "_id" : "Databases", "children" : [ "MongoDB", "dbm" ], "parent" : "Programming" }
{ "_id" : "MongoDB", "children" : [ ], "parent" : "Databases" }
{ "_id" : "dbm", "children" : [ ], "parent" : "Databases" }

insérer avec un document invalide [taille enfant> 2]

> db.node.insert({_id : "1", children : ["c1", "c2", "c3"], parent : "p1"})
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})
> 

l'insertion a échoué avec une erreur de validation

mise à jour - tentative d'ajout d'un troisième enfant pour les bases de données _id, échec avec erreur de validation

> db.node.updateOne( { _id: "Databases"}, {$push : {children: [ "Oracle" ]}} )
2018-02-25T21:00:08.087+0530 E QUERY    [thread1] WriteError: Document failed validation :
WriteError({
    "index" : 0,
    "code" : 121,
    "errmsg" : "Document failed validation",
    "op" : {
        "q" : {
            "_id" : "Databases"
        },
        "u" : {
            "$push" : {
                "children" : [
                    "Oracle"
                ]
            }
        },
        "multi" : false,
        "upsert" : false
    }
})
[email protected]/mongo/shell/bulk_api.js:466:48
Bulk/[email protected]/mongo/shell/bulk_api.js:846:49
Bulk/[email protected]/mongo/shell/bulk_api.js:910:13
Bulk/[email protected]/mongo/shell/bulk_api.js:1154:21
[email protected]/mongo/shell/crud_api.js:572:17
@(shell):1:1
> 

veuillez vous référer à schema-validation &jsonSchema pour plus d'options, ajouter la validation à la collection existante et gérer les échecs de validation