Có, bạn có thể xác thực tất cả các tài liệu con trong một tài liệu bằng cách phủ định $elemMatch
, và bạn có thể đảm bảo rằng kích thước không phải là 1. Mặc dù vậy, nó chắc chắn là không đẹp! Và cũng không rõ ràng.
> 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 }
Điều này là khó hiểu, nhưng nó hoạt động! Ý nghĩa của nó là chỉ chấp nhận các tài liệu không có kích thước của roles
là 1 cũng không phải là roles
có một phần tử có tên name
đó không phải là một chuỗi name
hoặc created_by
đó không phải là một chuỗi name
.
Điều này dựa trên thực tế là về mặt logic,
Tương đương với
Chúng ta phải sử dụng cái sau vì MongoDB chỉ cung cấp cho chúng ta một toán tử tồn tại.
Bằng chứng
Các tài liệu hợp lệ hoạt động:
> 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 })
Nếu một trường bị thiếu trong roles
, nó không thành công:
> db.users.insert({
... name: 'hello',
... roles: [
... {name: 'foo', created_by: '2222'},
... {created_by: '3333'},
... ]
... })
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Nếu một trường trong roles
có loại sai, nó không thành công:
> 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"
}
})
Nếu roles
có kích thước 1 nó không thành công:
> db.users.insert({
... name: 'hello',
... roles: [
... {name: 'foo', created_by: '2222'},
... ]
... })
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Điều duy nhất tôi không thể tìm ra rất tiếc là làm thế nào để đảm bảo rằng các vai trò là một mảng. roles: {$type: 'array'}
dường như không thành công mọi thứ, tôi đoán vì nó thực sự kiểm tra xem các phần tử có thuộc loại 'array'
không ?