2012-06-18 12 views
7

मैं मोंगोडब से निपटने के लिए जावा/मॉर्फिया का उपयोग कर रहा हूं। डिफ़ॉल्ट ऑब्जेक्ट आईडी जावा परत से उपयोग करने के लिए बहुत सुविधाजनक नहीं है। ऑब्जेक्टआईडी का उपयोग करके कुंजी उत्पादन प्रक्रिया को रखते हुए मैं इसे एक स्ट्रिंग प्रकार बनाना चाहता हूं, _id = new ObjectId.toString() कहें।क्या मैं स्ट्रिंग को मोंगोड दस्तावेज़ के लिए आईडी प्रकार के रूप में उपयोग कर सकता हूं?

मैं जानना चाहता हूं कि इस तरह से कोई दुष्प्रभाव ऐसा कर रहा है या नहीं? उदाहरण के लिए, क्या यह डेटाबेस प्रदर्शन को प्रभावित करेगा या किसी भी माध्यम से महत्वपूर्ण संघर्ष करेगा? यह sharding पर्यावरण को प्रभावित करेगा ...

+0

आप के बारे में क्यों ObjectId असुविधाजनक है और अधिक व्याख्या कर सकते हैं? आप आसानी से एक आईडी से बना सकते हैं जैसे 'id = new ObjectId (str) ' –

+0

स्ट्रिंग प्रत्येक जावा प्रोग्राम में उपयोग किया जाने वाला प्रकार है, जबकि ऑब्जेक्टआईडी नहीं है। मैं अपने पुस्तकालय का उपयोग करने वाले अन्य घटकों के लिए एक नया प्रकार शुरू नहीं करना चाहता हूं। शायद इसे मॉर्फिया, मोंगोडब और बीएसओ लाइब्रेरी आयात करने की आवश्यकता होगी, यह अभी भी बेहतर है अगर मेरी लाइब्रेरी का उपयोग करने वाले लोग ऑब्जेक्ट आईडी –

+0

हम्म समेत मोंगोडब प्रकारों के लिए पारदर्शी हैं ... लेकिन यदि आपकी लाइब्रेरी मोंगो में डेटा संग्रहीत कर रही है, तो mongo.jar नहीं होगा वैसे भी कक्षा में होने की जरूरत है? इसके अलावा, एक ओवरहेड बनाने और कचरा बहुत सारे स्ट्रिंग्स इकट्ठा कर रहा है। –

उत्तर

18

आप (सरणी को छोड़कर) एक _id क्षेत्र के लिए मूल्य के किसी भी प्रकार का उपयोग कर सकते हैं। यदि आप ऑब्जेक्टआईडी का उपयोग नहीं करना चुनते हैं, तो आपको किसी भी तरह मूल्यों की विशिष्टता की गारंटी देनी होगी (स्ट्रिंग करने के लिए ऑब्जेक्ट आईडी कास्टिंग करना होगा)। यदि आप डुप्लिकेट कुंजी डालने का प्रयास करते हैं, तो त्रुटि उत्पन्न होगी और आपको इससे निपटना होगा।

मुझे यकीन है कि क्या प्रभाव यह sharded क्लस्टर पर होगा जब आप अलग अलग टुकड़ों के लिए एक ही _ id के साथ दो दस्तावेज़ सम्मिलित करने का प्रयास नहीं कर रहा हूँ। मुझे संदेह है कि यह आपको डालने देगा, लेकिन यह आपको बाद में काट देगा। (मुझे इसका परीक्षण करना होगा)।

कहा कि, आप _id = (new ObjectId).toString() के साथ कोई मुसीबतों होना चाहिए।

+0

यह अच्छा है। धन्यवाद! –

+0

आपका दूसरा और तीसरा वाक्य एक-दूसरे के खिलाफ है। तीसरा सही है। जवाब में संदेह मत करो। साथ ही, '_id' प्रकार 'सरणी' के मान को पकड़ सकता है। – Dyin

+0

वे एक-दूसरे के साथ कितने विरोध कर रहे हैं? –

4

मैंने वास्तव में वही किया क्योंकि मुझे ऑब्जेक्टआईडी को जेएसओएन में परिवर्तित करने में कुछ समस्या आ रही थी।

मैं तो

@Id 
private String id; 
public String getId() { 
    return id(); 
} 
public void setId(String id) { 
    this.id = id; 
} 

की तरह कुछ किया था और सब कुछ ठीक काम किया तक मैं एक पहले से डाला दस्तावेज़ को अद्यतन करने का फैसला किया, जब मैं आईडी द्वारा वस्तु मिल JSON के माध्यम से पेज को भेजा और एक ही अद्यतन वस्तु प्राप्त जेएसओएन पोस्ट द्वारा और फिर डेटास्टोर से सहेजने वाले फ़ंक्शन का उपयोग किया गया था, पिछले डेटा को अपडेट करने के बजाय यह पहले से मौजूद एक को अपडेट करने के बजाय एक नया दस्तावेज़ डाला गया था।

यहां तक ​​कि सबसे खराब नया दस्तावेज़ पहले से एक डाला से एक ही आईडी था, कुछ मैंने सोचा असंभव था।

वैसे भी मैं एक ObjectID के रूप में निजी वस्तु setted और सिर्फ स्ट्रिंग के रूप में तैयार हो जाओ छोड़ दिया और फिर यह अपेक्षा के अनुरूप, यकीन नहीं है कि आपके मामले के बारे में सोचा में मदद करता है में काम किया।

@Id 
private ObjectId id; 
public String getId() { 
    return id.toString(); 
} 
public void setId(String id) { 
    this.id = new ObjectId(id); 
} 
1

हां, आप एक स्ट्रिंग का उपयोग अपने _id के रूप में कर सकते हैं।

मैं द्वारा अनुशंसित केवल यदि आप (दस्तावेज में) कुछ मूल्य है स्वाभाविक रूप से एक अच्छा अद्वितीय महत्वपूर्ण है। मैंने इस डिज़ाइन को एक संग्रह में उपयोग किया जहां "xxxxyyyy" फ़ॉर्म के स्ट्रिंग भू-टैग थे; यह अद्वितीय-प्रति-दस्तावेज़ फ़ील्ड दस्तावेज़ और में होने वाला था, मुझे इसे एक इंडेक्स बनाना था ... तो इसे एक कुंजी के रूप में क्यों न उपयोग करें? (इसने एक अतिरिक्त कुंजी-मूल्य जोड़ी से परहेज किया, और संग्रह पर दूसरी सूचकांक से परहेज किया, क्योंकि मोंडो डीबी स्वाभाविक रूप से "_id" पर एक इंडेक्स बनाता है। संग्रह के आकार को देखते हुए, इनमें से दोनों कुछ गंभीर अंतरिक्ष बचत में शामिल हुए।)

हालांकि, आपके प्रश्न के स्वर ("ऑब्जेक्टिड्स बहुत सुविधाजनक नहीं हैं"), यदि एकमात्र कारण आप स्ट्रिंग का उपयोग करना चाहते हैं, तो आप ऑब्जेक्ट आईडी को व्यवस्थित तरीके से प्रबंधित करने के तरीके से परेशान नहीं होना चाहते हैं .. मैं सुझाव दूंगा कि आपके चारों ओर अपने सिर को पाने के लिए यह आपके समय के लायक है। मुझे यकीन है कि उन्हें कोई परेशानी नहीं है ... एक बार जब आप उनके साथ अपनी परेशानी का पता लगाएंगे।

अन्यथा: आपके विकल्प क्या हैं? क्या आप भविष्य में एक मोंगोडीबी का उपयोग करते समय हर बार स्ट्रिंग आईडी बनाते हैं?

+1

हे मेरे प्रश्न पर वापस आने के लिए धन्यवाद, लगभग चार साल पहले पूछा गया था। मुझे लगता है कि तब से मुझे मोंगोडीबी पर और समझ मिली है। और अब मैं ऑब्जेक्टआईडी को एक स्ट्रिंग के रूप में संग्रहीत करने पर विचार करता हूं, वास्तव में एक बुरा विचार है, क्योंकि ऑब्जेक्टआईडी सचमुच तीन पूर्णांक है जबकि स्ट्रिंग का प्रतिनिधित्व 24 वर्ण है, जो अंतरिक्ष और समय दोनों के मामले में कुशल नहीं है। –

1

मैं यह जोड़ना चाहता हूं कि स्वचालित रूप से जेनरेट किए गए बीएसओएन ऑब्जेक्ट को एक अद्वितीय पहचानकर्ता के रूप में उपयोग करना हमेशा अच्छा विचार नहीं है, अगर यह एप्लिकेशन को पास हो जाता है: यह संभावित रूप से उपयोगकर्ता द्वारा छेड़छाड़ की जा सकती है। ObjectIDs क्रमिक रूप से उत्पन्न हो दिखाई देते हैं, इसलिए यदि आप आवश्यक प्राधिकार तंत्र को लागू करने में विफल, दुर्भावनापूर्ण उपयोगकर्ता केवल मूल्य वह है, संसाधनों का उपयोग करने के लिए उपयोग वह नहीं होना चाहिए बढ़ाने के सकता है।

इसलिए UUID प्रकार पहचानकर्ता का उपयोग कर सुरक्षा-थ्रू-अंधकार की एक परत प्रदान करेगा। बेशक, प्राधिकरण (क्या इस उपयोगकर्ता को अनुरोधित संसाधन तक पहुंचने की अनुमति है) एक जरूरी है, लेकिन आपको उपरोक्त ऑब्जेक्ट आईडी सुविधा से अवगत होना चाहिए।

दोनों दुनिया का सबसे अच्छा मिलता है, UUID जो आपके ObjectID लंबाई (12 या 24 वर्ण) से मेल खाता पैदा करते हैं और इसका इस्तेमाल ObjectID प्रकार की अपनी _ id बनाने के लिए करने के लिए।

+2

"यदि आप आवश्यक प्राधिकरण को लागू करने में विफल रहते हैं" तो आप वैसे भी बर्बाद हो जाते हैं। अस्पष्टता सुरक्षा नहीं है। यह केवल खुद को मूर्ख बना रहा है "हम सुरक्षित हैं"। – Piohen

+0

@Piohen कैसे दूसरे पैराग्राफ पढ़ने में विफल रहता है मेरे बाहर है ... –

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

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