2012-01-24 35 views
5

के साथ शुरू इस पोस्ट MongoDB finding nested elements पर, लेखक का दावा है MongoDB दस्तावेज़ संरचना

 car : { "$ref" : "cars" , "$id" : { "$oid" : "4e8478ace4b0dea06288ad63"}} 

जब मैं समस्या पुन: पेश करने की कोशिश की, मैं MongoDB प्रविष्टि के साथ कुछ अजीब व्यवहार का सामना करना पड़ा है कि

जब ऊपर नमूना डेटा पर प्रविष्टि चलाने के लिए, मैं त्रुटि निम्न गया

> db.sample.insert({car:{ "$ref" : "cars" , "$id" : { "$oid" : "4e8478ace4b0dea06288ad63"}}}) 
Tue Jan 24 14:09:07 uncaught exception: field names cannot start with $ [$oid] 

यह कहना है कि फ़ील्ड नामसाथ शुरू नहीं कर सकते।

thats मामले हैं, यह अगर मैं OID से $ को दूर काम करते हैं और छोड़ दिया शेष $ref & $id अछूता

> db.sample.insert({car:{ "$ref" : "cars" , "$id" : { "oid" : "4e8478ace4b0dea06288ad63"}}}) 
    > db.sample.find() 
{ "_id" : ObjectId("4f1e6fbc403aae757ec6dea5"), "car" : { "$ref" : "cars", "$id" : { "oid" : "4e8478ace4b0dea06288ad63" } } } 

आश्चर्यजनक रूप से यह काम नहीं करना चाहिए। अब यह स्वीकार करता है क्षेत्रों $

के साथ शुरू भी जब मैं इस क्वेरी

> db.sample.insert({ "$ref" : "cars" }) 
document to insert can't have $ fields 

मैं त्रुटि वापस मिल की कोशिश की।

मुझे समझ में नहीं आता कि इसका क्या कारण है? किसी के पास एक स्पष्ट विचार है? वे DBRef सम्मेलन से जुड़े हुए हैं -

उत्तर

4

$id और $ref विशेष पहचानकर्ता dbrefs के लिए उपयोग किए जाते हैं। अन्यथा, $ से शुरू होने वाले फ़ील्ड नामों की अनुमति नहीं है।

हालांकि, आपका पहला स्तर का दस्तावेज़ स्वयं एक ड्रेबफ नहीं होना चाहिए, इसलिए त्रुटि "दस्तावेज़ को सम्मिलित करने के लिए $ फ़ील्ड नहीं हो सकते हैं"।

हालांकि, dbrefs को उप-दस्तावेज़ों के रूप में अनुमति दी जाती है, उदा। (official docs से)

"name" : "Joe", 
"classes" : [ 
     { 
       "$ref" : "courses", 
       "$id" : ObjectId("4b0552b0f0da7d1eb6f126a1") 
     } 
] 

अब $oid एक विशेष पहचानकर्ता क्योंकि $ विशेष अर्थ विज्ञान है नहीं है, और अनुमति नहीं है: $inc के बारे में सोचो। यह एक ऑपरेटर है, लेकिन यदि $ फ़ील्ड नामों की अनुमति है, तो यह एक फ़ील्ड का नाम भी हो सकता है।

आप जब positional operator in updates का उपयोग कर सावधान रहना होगा:

स्थितीय ऑपरेटर एक Upsert के साथ संयुक्त नहीं किया जा सकता क्योंकि यह एक मिलान सरणी तत्व की आवश्यकता है। यदि आपके अपडेट को सम्मिलित करने के परिणामस्वरूप "$" का शाब्दिक रूप से फ़ील्ड नाम के रूप में उपयोग किया जाएगा।

+1

हाँ, यही कारण है ..धन्यवाद – RameshVel

+0

क्या डीबीआरएफएस का मौका देने का कोई तरीका है? – Backlit

+0

@ बैकलिट: मुझे खेद है कि मैं सवाल समझ नहीं पा रहा हूं। आप dbrefs के वाक्यविन्यास को बदलना चाहते हैं? सुनिश्चित करें कि आप समझते हैं कि आपको dbrefs का उपयोग करने की आवश्यकता नहीं है - असल में, आमतौर पर इसकी आवश्यकता नहीं होती है और आधिकारिक दस्तावेज़ आपको एक साधारण सीधा लिंक का उपयोग करने की सलाह देते हैं, जैसे 'UserId: 423434'। – mnemosyn

1

$ref$id और $db ही मान्य कुंजी जो डॉलर चिन्ह के साथ शुरू कर रहे हैं।

कारण आप डॉलर की साइन से शुरू होने वाली अपनी चाबियों का उपयोग नहीं कर सकते हैं क्योंकि यह Specialmeaning है और अन्यथा अस्पष्टता पैदा करेगा।

+0

क्या इसके आसपास वैसे भी है? उदाहरण के लिए, उनसे बच निकला? – devo

संबंधित मुद्दे