दिलचस्प पोस्ट
मैं git में कैसे अन्य कमानों को आज्ञा देता हूं? एक संख्यात्मक रेंज को दूसरे पर मैप करना टीसीपी: क्या दो अलग-अलग सॉकेट बंदरगाह साझा कर सकते हैं? एचटीएमएल स्ट्रिंग्स को पढ़ना / आउटपुट करना मैं अपने एप्लिकेशन से सेटिंग एप्लिकेशन कैसे खोलूं? जावा में शब्दों को संख्या बदलने के लिए कैसे करें इस एंड्रॉइड एसडीके को एंड्रॉइड डेवलपर टूलकिट संस्करण 23.0.0 या इसके बाद के संस्करण की आवश्यकता है मोचा के साथ एक भी परीक्षा कैसे चलाएं? रैखिक समय में छंटनी? ऑटो लेआउट UIScrollView गतिशील ऊंचाइयों के साथ subviews के साथ पेजिंग के साथ UICollectionView – सेटिंग पृष्ठ चौड़ाई जावा डिफ़ॉल्ट स्टैक आकार स्थानीय फ़ाइल लोड करते समय "क्रॉस मूल अनुरोध केवल HTTP के लिए समर्थित हैं।" एक छवि से सफेद पृष्ठभूमि निकालें और इसे पारदर्शी बनाएं सीरियलाइजिंग और जेएमई पोस्ट और पीएचपी के साथ एक फार्म जमा करना

मुंगूस खोज / अद्यतन उप-दस्तावेज

मेरे पास दस्तावेज़ फ़ोल्डर के लिए निम्न स्कीमा हैं:

var permissionSchema = new Schema({ role: { type: String }, create_folders: { type: Boolean }, create_contents: { type: Boolean } }); var folderSchema = new Schema({ name: { type: string }, permissions: [ permissionSchema ] }); 

इसलिए, प्रत्येक पृष्ठ के लिए मुझे कई अनुमतियां मिल सकती हैं। मेरे सीएमएस में एक पैनल है जहां मैं सभी फ़ोल्डरों और उनकी अनुमतियों को सूचीबद्ध करता हूं। व्यवस्थापक एक ही अनुमति को संपादित कर सकता है और इसे सहेज सकता है।

मैं आसानी से पूरे फ़ोल्डर दस्तावेज़ को इसकी अनुमति सरणी के साथ सहेज सकता था, जहां केवल एक अनुमति संशोधित की गई थी। लेकिन मैं सभी दस्तावेज़ (असली स्कीमा के अधिक फ़ील्ड) को सहेजना नहीं चाहता इसलिए मैंने ऐसा किया:

 savePermission: function (folderId, permission, callback) { Folder.findOne({ _id: folderId }, function (err, data) { var perm = _.findWhere(data.permissions, { _id: permission._id }); _.extend(perm, permission); data.markModified("permissions"); data.save(callback); }); } 

लेकिन समस्या यह है कि perm हमेशा अपरिभाषित है ! मैंने इस तरीके से "स्थैतिक रूप से" अनुमति प्राप्त करने की कोशिश की:

 var perm = data.permissions[0]; 

और यह बहुत अच्छा काम करता है, इसलिए समस्या यह है कि अंडरस्कोर पुस्तकालय अनुमतियाँ सरणी को क्वेरी करने में सक्षम नहीं है। इसलिए मुझे लगता है कि प्राप्त किए गए दस्तावेज़ के उप-दस्तावेज प्राप्त करने के लिए एक बेहतर (और वर्किंग) तरीका है।

कोई उपाय?

पीएस: मैंने प्रत्येक मद को "के लिए" लूप और आंकड़ों की जांच करने के लिए data.permission सरणी में जांच का हल किया [i] ._ id == अनुमति ._id, लेकिन मुझे एक चालाक समाधान चाहिए, मुझे पता है वहाँ एक है!

Solutions Collecting From Web of "मुंगूस खोज / अद्यतन उप-दस्तावेज"

जैसे कि आप ध्यान दें, मोंगोज़ में डिफ़ॉल्ट यह है कि जब आप इस तरह एक सरणी में "एम्बेड" डेटा देते हैं तो आपको प्रत्येक एंट्री एंट्री के लिए एक मूल्य मान प्राप्त होता है जैसे कि यह स्वयं के उप-दस्तावेज़ गुणों के भाग के रूप में है। आप उस वस्तु का सूचक निर्धारित करने के लिए वास्तव में इस मान का उपयोग कर सकते हैं जिसे आप अपडेट करना चाहते हैं ऐसा करने का मोंगोडाबी तरीका स्थितीय $ ऑपरेटर चर है, जो सरणी में "मिलान" स्थिति रखता है:

 Folder.findOneAndUpdate( { "_id": folderId, "permissions._id": permission._id }, { "$set": { "permissions.$": permission } }, function(err,doc) { } ); 

उस .findOneAndUpdate() विधि संशोधित दस्तावेज़ लौटाएगा या अन्यथा आप बस एक विधि के रूप में .findOneAndUpdate() उपयोग कर सकते हैं यदि आपको दस्तावेज़ लौटाए जाने की आवश्यकता नहीं है। मुख्य भाग अद्यतन करने के लिए सरणी के तत्व "मिलान" कर रहे हैं और "पहचानने" के रूप में पहले जैसा उल्लेख किया गया है, स्थितीय रूप से मिलान किया गया है।

फिर निश्चित रूप से आप $set ऑपरेटर का उपयोग कर रहे हैं ताकि केवल आपके द्वारा निर्दिष्ट किए गए तत्व को वास्तव में "वायर पर" भेजा जाये। आप इसे "डॉट नोटेशन" के साथ आगे बढ़ा सकते हैं और बस उन तत्वों को निर्दिष्ट करें जिन्हें आप अपडेट करना चाहते हैं। जैसे की:

 Folder.findOneAndUpdate( { "_id": folderId, "permissions._id": permission._id }, { "$set": { "permissions.$.role": permission.role } }, function(err,doc) { } ); 

तो यह लचीलापन है जो MongoDB प्रदान करता है, जहां आप वास्तव में एक दस्तावेज़ को अपडेट करने के तरीके में "लक्षित" हो सकते हैं।

हालांकि यह क्या करता है "बाईपास" आपके "मॉन्गोस" स्कीमा, जैसे "मान्यकरण" या अन्य "प्री-सेवुक हुक" में हो सकता है, आपके द्वारा बनाया गया तर्क हो सकता है इसका कारण यह है कि "इष्टतम" तरीका एक MongoDB "सुविधा" है और यह कैसे डिजाइन किया गया है। मोंगोज़ ही इस तर्क पर "सुविधा" आवरण की कोशिश करता है। लेकिन अगर आप खुद को कुछ नियंत्रण लेने के लिए तैयार हैं, तो अपडेट सबसे अनुकूल तरीके से किया जा सकता है।

तो जहां ऐसा करना संभव है, अपने डेटा को "एम्बेडेड" रखें और संदर्भित मॉडल का उपयोग न करें। यह सरल अद्यतनों में "माता पिता" और "बच्चे" वस्तुओं दोनों के परमाणु अद्यतन की अनुमति देता है, जहां आपको संगामिति के बारे में चिंता करने की आवश्यकता नहीं है। शायद एक कारण है कि आपने पहले स्थान पर मोंगोडीबी को चुना होगा।

यदि आप अलग संग्रह नहीं करना चाहते हैं, तो बस सेवमा में फ़ोल्डर खोलें।

 var folderSchema = new Schema({ name: { type: string }, permissions: [ { role: { type: String }, create_folders: { type: Boolean }, create_contents: { type: Boolean } } ] }); 

यदि आपको अलग संग्रह की आवश्यकता है, तो यह सबसे अच्छा तरीका है:

आपके पास एक अनुमति मॉडल हो सकता है:

 var mongoose = require('mongoose'); var PermissionSchema = new Schema({ role: { type: String }, create_folders: { type: Boolean }, create_contents: { type: Boolean } }); module.exports = mongoose.model('Permission', PermissionSchema); 

और अनुमति दस्तावेज़ के संदर्भ के साथ एक फ़ोल्डर मॉडल। आप इस तरह एक और स्कीमा का संदर्भ दे सकते हैं:

 var mongoose = require('mongoose'); var FolderSchema = new Schema({ name: { type: string }, permissions: [ { type: mongoose.Schema.Types.ObjectId, ref: 'Permission' } ] }); module.exports = mongoose.model('Folder', FolderSchema); 

और फिर Folder.findOne().populate('permissions') कॉल करें Folder.findOne().populate('permissions') क्षेत्र अनुमतियों को Folder.findOne().populate('permissions') लिए मंगोल को पूछने के लिए आबाद करें Folder.findOne().populate('permissions')

अब, निम्नलिखित:

 savePermission: function (folderId, permission, callback) { Folder.findOne({ _id: folderId }).populate('permissions').exec(function (err, data) { var perm = _.findWhere(data.permissions, { _id: permission._id }); _.extend(perm, permission); data.markModified("permissions"); data.save(callback); }); } 

perm फ़ील्ड को अनिर्धारित नहीं किया जाएगा (यदि अनुमति._id वास्तव में अनुमतियों में है), चूंकि यह मोंगोज द्वारा आबाद किया गया है