MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Xác thực tài liệu lồng nhau MongoDB cho các tài liệu con

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 ?



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kết quả truy vấn Mongoose .find chứa siêu dữ liệu truy vấn? không thể chỉ chiếu thủ công từng thuộc tính của bộ sưu tập, làm thế nào để chỉ lấy tài liệu?

  2. làm thế nào để chuyển đổi dấu thời gian thành ngày tháng trong mongodb?

  3. Sử dụng các phương thức của lớp Tài liệu MongoEngine để xác thực tùy chỉnh và lưu trước các móc

  4. Trong Mongo sự khác biệt giữa $ near và $ nearSphere là gì?

  5. MongoError:tên cơ sở dữ liệu không thể chứa ký tự '' khi sử dụng mongoosejs kết nối với mLab