MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB उप-दस्तावेजों के लिए दस्तावेज़ सत्यापन नेस्टेड

हां, आप कर सकते हैं $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 हमें केवल एक मौजूदा ऑपरेटर देता है।

सबूत

मान्य दस्तावेज़ काम करते हैं:

> 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' प्रकार के हैं ?



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Heroku पर परिनियोजन के लिए स्ट्रांगलूप लूपबैक MongoDB डेटा स्रोत को कैसे कॉन्फ़िगर करें

  2. MongoDB नेस्टेड ऐरे इंटरसेक्शन क्वेरी

  3. अद्वितीय फ़ील्ड वाले सभी दस्तावेज़ों के लिए उल्का क्वेरी

  4. mongoexport JSON पार्सिंग त्रुटि

  5. MongoDB में नेस्टेड टिप्पणियाँ