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