के रूप में अन्य उत्तर में बताया गया MongoDB की अनुमति नहीं है $
या .
की वजह से नक्शा कुंजी के रूप में वर्ण फ़ील्ड नामों पर प्रतिबंध । हालांकि, जैसा कि डॉलर साइन ऑपरेटर में उल्लेख किया गया है, इस प्रतिबंध से बचना आपको ऐसी चाबियों के साथ दस्तावेज़ सम्मिलित करने से नहीं रोकता है, यह आपको उन्हें अपडेट करने या क्वेरी करने से रोकता है।
बस की जगह की समस्या .
के साथ [dot]
या U+FF0E
(के रूप में इस पृष्ठ पर कहीं उल्लेख) क्या जब उपयोगकर्ता वैध कुंजी संग्रहीत करना चाहता है होता है, है [dot]
या U+FF0E
?
एक दृष्टिकोण जो फेंटम के एफ़ोर्फिया चालक को लगता है, वह जावा के समान यूनिकोड एस्केप अनुक्रम का उपयोग करना है, लेकिन भागने के चरित्र को सुनिश्चित करना पहले बच जाता है। संक्षेप में, निम्नलिखित स्ट्रिंग प्रतिस्थापन किए गए हैं (*):
\ --> \\
$ --> \u0024
. --> \u002e
एक रिवर्स रिप्लेसमेंट तब किया जाता है जब मैप कीज को बाद में MongoDB से पढ़ा जाता है ।
या फेंटम कोड में:
Str encodeKey(Str key) {
return key.replace("\\", "\\\\").replace("\$", "\\u0024").replace(".", "\\u002e")
}
Str decodeKey(Str key) {
return key.replace("\\u002e", ".").replace("\\u0024", "\$").replace("\\\\", "\\")
}
किसी उपयोगकर्ता को इस तरह के रूपांतरणों के बारे में जानने के लिए केवल समय की आवश्यकता होती है जब वह ऐसी चाबियों के लिए क्वेरीज़ का निर्माण करता है।
यह देखते हुए कि dotted.property.names
कॉन्फ़िगरेशन उद्देश्यों के लिए डेटाबेस में संग्रहीत करना आम है, मेरा मानना है कि इस दृष्टिकोण को ऐसे सभी मानचित्र कुंजियों पर प्रतिबंध लगाने के लिए बेहतर है।
(*) afMorphia वास्तव में जावा में यूनिकोड एस्केप सिंटैक्स में उल्लिखित पूर्ण / उचित यूनिकोड भागने के नियम करता है, लेकिन वर्णित प्रतिस्थापन अनुक्रम ठीक वैसे ही काम करता है।