हां, आप कर सकते हैं $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'
प्रकार के हैं ?