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

サブドキュメントのMongoDBネストされたドキュメント検証

    はい、できます $elemMatchを否定して、ドキュメント内のすべてのサブドキュメントを検証します 、サイズが1でないことを確認できます。そして、正確には明らかではありません。

    > db.createCollection('users', {
    ...   validator: {
    ...     name: {$type: 'string'},
    ...     roles: {$exists: 'true'},
    ...     $nor: [
    ...       {roles: {$size: 1}},
    ...       {roles: {$elemMatch: {
    ...         $or: [
    ...           {name: {$not: {$type: 'string'}}},
    ...           {created_by: {$not: {$type: 'string'}}},
    ...         ]
    ...       }}}
    ...     ],
    ...   }  
    ... })
    { "ok" : 1 }
    

    これは紛らわしいですが、うまくいきます!つまり、rolesのサイズがどちらでもないドキュメントのみを受け入れるということです。 1でもrolesでもありません nameの要素があります それはstringではありません またはcreated_by それはstringではありません 。

    これは、論理的には

    と同等です

    MongoDBはexists演算子しか提供しないため、後者を使用する必要があります。

    証明

    有効なドキュメントは機能します:

    > db.users.insert({
    ...   name: 'hello',
    ...   roles: [],
    ... })
    WriteResult({ "nInserted" : 1 })
    
    > db.users.insert({
    ...   name: 'hello',
    ...   roles: [
    ...     {name: 'foo', created_by: '2222'},
    ...     {name: 'bar', created_by: '3333'},
    ...   ]
    ... })
    WriteResult({ "nInserted" : 1 })
    

    rolesにフィールドがない場合 、失敗します:

    > db.users.insert({
    ...   name: 'hello',
    ...   roles: [
    ...     {name: 'foo', created_by: '2222'},
    ...     {created_by: '3333'},
    ...   ]
    ... })
    WriteResult({
        "nInserted" : 0,
        "writeError" : {
            "code" : 121,
            "errmsg" : "Document failed validation"
        }
    })
    

    rolesのフィールドの場合 タイプが間違っていると失敗します:

    > db.users.insert({
    ...   name: 'hello',
    ...   roles: [
    ...     {name: 'foo', created_by: '2222'},
    ...     {name: 'bar', created_by: 3333},
    ...   ]
    ... })
    WriteResult({
        "nInserted" : 0,
        "writeError" : {
            "code" : 121,
            "errmsg" : "Document failed validation"
        }
    })
    

    rolesの場合 サイズ1で失敗します:

    > db.users.insert({
    ...   name: 'hello',
    ...   roles: [
    ...     {name: 'foo', created_by: '2222'},
    ...   ]
    ... })
    WriteResult({
        "nInserted" : 0,
        "writeError" : {
            "code" : 121,
            "errmsg" : "Document failed validation"
        }
    })
    

    残念ながら私が理解できない唯一のことは、役割が配列であることを確認する方法です。 roles: {$type: 'array'} すべてが失敗するようです。要素が'array'型であることを実際にチェックしているためだと思います。 ?



    1. mongodbの新しいポートを構成する方法

    2. MongoDBアグリゲーションパフォーマンス機能

    3. 何百万もの画像のストレージ

    4. Mongoidの埋め込みドキュメントからフィールドを除外するにはどうすればよいですか?