はい、できます $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'
型であることを実際にチェックしているためだと思います。 ?