sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB vnořené ověření dokumentu pro dílčí dokumenty

Ano, můžete ověřte všechny dílčí dokumenty v dokumentu negací $elemMatch , a můžete se ujistit, že velikost není 1. Určitě to ale není hezké! A také to není úplně zřejmé.

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

Je to matoucí, ale funguje to! Znamená to přijímat pouze dokumenty, které nemají velikost roles je 1 ani roles má prvek s name to není string nebo created_by to není string .

To je založeno na skutečnosti, že z logického hlediska

Je ekvivalentní k

Musíme použít to druhé, protože MongoDB nám poskytuje pouze existující operátor.

Důkaz

Platné dokumenty fungují:

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

Pokud v roles chybí pole , selže:

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

Pokud je pole v roles má nesprávný typ, selže:

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

Pokud roles má velikost 1, selže:

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

Jediná věc, kterou bohužel nemohu zjistit, je, jak zajistit, aby role byly pole. roles: {$type: 'array'} Zdá se, že vše selhalo, předpokládám, protože ve skutečnosti kontroluje, zda jsou prvky typu 'array' ?



  1. mongoose findById pomocí asynchronního čekání

  2. náklady na klíče v databázi dokumentů JSON (mongodb, elasticsearch)

  3. Skript Redis lua nefunguje

  4. PyMongo:Jak používat agregát a ukládat výsledky do jiné sbírky?