sql >> データベース >  >> NoSQL >> MongoDB

mongodbで親ノードの最大参照を制限する方法

    mongoバージョン3.6を使用している場合は、$jsonSchemaを使用してスキーマ検証を有効にできます。 サーバー側で

    更新/挿入する各ドキュメントは、検証スキーマに対して検証されます。検証に失敗すると、エラーがスローされ、ドキュメントに変更は加えられません。

    サンプルnode コレクションスキーマ

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

    検証スキーマ

    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"
                }
             }
          }
       }
    });
    

    [有効なドキュメントを含む]

    を挿入します
    > 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 })
    > 
    

    検索

    > 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" }
    

    無効なドキュメントで挿入[子サイズ>2]

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

    挿入が検証エラーで失敗しました

    更新-_idデータベースの3番目の子を追加しようとしましたが、検証エラーで失敗しました

    > 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
    > 
    

    schema-validation を参照してください & jsonSchema その他のオプションについては、既存のコレクションに検証を追加し、検証の失敗を処理します




    1. Jadeでmongodbドキュメントを表示するExpress

    2. ネストされた配列内のMongodbインクリメント値

    3. 数値が範囲内にあるかどうかを判断するためのRedisまたはMongo?

    4. 多数のドキュメント用のシャーディングキー(MongoDB)