2012-06-29 10 views
16

मेरे पास स्प्रिंग डेटा के साथ मोंगोडीबी के बारे में कोई प्रश्न है।MongoDB एंबेडेड ऑब्जेक्ट्स में कोई आईडी नहीं है (शून्य मान)

@Document 
public class Deal { 
    @Id 
    private ObjectId _id; 
    private Location location; 
    private User user; 
    private String description; 
    private String title; 
    private String price; 
    private boolean approved; 
    private Date expirationDate; 
    private Date publishedDate; 
} 

@Document 
public class Location { 
    @Id 
    private ObjectId _id; 
    private Double latitude; 
    private Double longitude; 
    private String country; 
    private String street; 
    private String zip; 
} 

@Document 
public class User { 
    @Id 
    private ObjectId _id; 
    private String email; 
    private String password; 
    private String profile_image_url; 
    private Collection<Deal> deals = new ArrayList<Deal>(); 
} 
इन डोमेन मैं सफलतापूर्वक CRUD कार्य कर सकते हैं

: मैं इन डोमेन श्रेणियां होती हैं। केवल एक समस्या है। डील के साथ उपयोगकर्ता को सहेजते समय, सौदों और स्थान को मोंडोडीबी में सहेजते समय _id को शून्य पर सेट किया जाता है। मोंगोडीबी एम्बेडेड ऑब्जेक्ट्स के लिए अद्वितीय आईडी क्यों नहीं बना सकता?

एक सौदा के साथ एक उपयोगकर्ता बचाने के बाद परिणाम:

{ "_id" : ObjectId("4fed0591d17011868cf9c982"), 
    "_class" : "User", 
    "email" : "[email protected]", 
    "password" : "mimi", 
    "deals" : [ 
    { "_id" : null, 
     "location" : { "_id" : null, 
     "latitude" : 2.22, 
     "longitude" : 3.23445, 
     "country" : "Denmark", 
     "street" : "Denmark road 77", 
     "zip" : "2933" }, 
     "description" : "The new Nexus 7 Tablet. A 7 inch tablet from Google.", 
     "title" : "Nexus 7", 
     "price" : "1300", 
     "approved" : false, 
     "expirationDate" : Date(1343512800000), 
     "publishedDate" : Date(1340933521374) } ] } 

आप परिणाम से देख सकते हैं, डील और स्थान आईडी शून्य पर सेट है।

+0

एक आईडी रूट दस्तावेज़ की पहचान करता है, उप-दस्तावेज नहीं। कोई कारण नहीं है कि आप एक नेस्टेड दस्तावेज़ के लिए एक आईडी उत्पन्न करना चाहते हैं क्योंकि मोंगोडीबी केवल शीर्ष स्तर के दस्तावेज़ों को पुनर्प्राप्त कर सकता है। आपको वास्तव में नेस्टेड आईडी की क्या आवश्यकता है? –

+0

मुझे केवल सौदों की खोज करने की आवश्यकता है, न कि उपयोगकर्ता। अब मुझे उपयोगकर्ता से खोजना है और फिर लूप ने प्रोग्राम में प्रत्येक सौदे को प्रोग्रामेटिक रूप से फेंक दिया है। – Millad

+0

आईडी के पास ऐसा करने के लिए कुछ भी नहीं है जिसे आप खोज सकते हैं। '{' Deals.price 'की खोज करना बिल्कुल ठीक है: {$ gt: 1000}} '। फिर भी, यह क्वेरी उस 'उपयोगकर्ता' ऑब्जेक्ट को वापस कर देगी जिसे आपको मैन्युअल रूप से 'डील' को खींचना होगा। यह एक मोंगोडीबी सीमा है, स्प्रिंग डेटा द्वारा निहित कुछ भी नहीं। –

उत्तर

4

एक _id डिफ़ॉल्ट रूप से रूट डॉक्यूमेंट्स पर डिफ़ॉल्ट रूप से उप-दस्तावेज़ों पर सेट नहीं है।

आपको डालने और अपडेट करने के लिए अपने उप-दस्तावेज़ों के लिए _id को परिभाषित करने की आवश्यकता होगी।

+0

क्या वह मेरे लिए ऐसा नहीं करना चाहिए? मैं उसे कैसे कर सकता हूँ? क्या मुझे अकेले हर दस्तावेज़ डालना चाहिए और उन्हें एक साथ रखा जाना चाहिए? इस तरह मैं सम्मिलित करता हूं: mongoOperation.insert (सौदा); – Millad

+0

MongoDB यह आपके लिए नहीं करेगा लेकिन अब जब मैं दूसरी नज़र लेता हूं तो शायद आपके चालक को ... क्या आप मॉर्फिया का उपयोग कर रहे हैं? – Sammaye

+0

उत्तर के लिए धन्यवाद। मैं स्प्रिंग डेटा और मोंगो-जावा-ड्राइवर का उपयोग कर रहा हूं। जब मैं सौदों की खोज करता हूं तो मुझे एक उपयोगकर्ता वस्तु मिलती है। मैं उन सौदों का उपयोग नहीं कर सकता जिन्हें मुझे उपयोगकर्ता फेंकना है और फिर सौदों के लिए उपयोगकर्ता में प्रोग्रामेटिक रूप से क्वेरी करना है। – Millad

29

MongoDB CRUD संचालन (insert, update, find, remove) सभी विशेष रूप से शीर्ष स्तर के दस्तावेजों पर काम - हालांकि निश्चित रूप से आप एम्बेडेड दस्तावेजों में क्षेत्रों के आधार पर फ़िल्टर कर सकते हैं। एम्बेडेड दस्तावेज़ हमेशा मूल दस्तावेज़ में वापस आते हैं।

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

विशेष रूप से जावा में, यदि आप एम्बेडेड दस्तावेजों में _id क्षेत्र के लिए ObjectId मूल्यों उत्पन्न करना चाहते हैं, तो आप ऐसा के साथ क्या कर सकते हैं:

someEmbeddedDoc._id = new ObjectId(); 
+0

इसे साफ़ करने के लिए धन्यवाद। इसलिए यदि मैं केवल सौदों को सूचीबद्ध करना चाहता हूं तो मुझे डील दस्तावेज़ से उपयोगकर्ता दस्तावेज़ को अलग या स्थानांतरित करना होगा ताकि डील एक अलग दस्तावेज़ हो और उपयोगकर्ता एक अलग दस्तावेज़ हो और फिर क्वेरी हो। – Millad

+0

या तो मौजूदा डेटा मॉडल के साथ काम करने के लिए अपना कोड समायोजित करें या समायोजित करें। यदि आप अक्सर सौदों में हेरफेर कर रहे हैं, या यदि सौदे एक से अधिक उपयोगकर्ता से जुड़े होते हैं, तो डेटा मॉडल को सामान्यीकृत करना समझ में आता है। – dcrosta

2

मोंगो बनाने या जरूरत एम्बेडेड दस्तावेजों पर _id रों नहीं है। यदि आप चाहें तो _id फ़ील्ड जोड़ सकते हैं - मैंने इसे किया है।

@Document 
public class Location { 
    @Id 
    private ObjectId _id; 

    public Location() { 
     this._id = ObjectId.get(); 
    } 
} 

@Document 
public class User { 
    @Id 
    private ObjectId _id; 

    public User() { 
     this._id = ObjectId.get(); 
    } 
} 

यह मेरे लिए बहुत अच्छा काम करता है।

4

एक आरईएसटी आर्किटेक्चर के संदर्भ में यह सभी समझ में आता है कि नेस्टेड दस्तावेज़ों के पास अपने स्वयं के आईडी हैं।

  1. दृढ़ता कार्यान्वयन संसाधन प्रतिनिधित्व से स्वतंत्र होना चाहिए। एक एपीआई उपभोक्ता के रूप में मुझे परवाह नहीं है कि आप मोंगो या माइस्क्ल का उपयोग कर रहे हैं। यदि आप मोंगो में आईडी के बिना घोंसला दस्तावेज़ करते हैं तो कल्पना करें कि दृढ़ता परत को एक रिलेशनल डेटा बेस में कैसे बदला जाए। अब एक ही अभ्यास को कार्यान्वित स्वतंत्र दृष्टिकोण के साथ पहले सोचा था। एक रिलेशनल डीबी में रूट नेस्टेड डॉक्स मॉडलिंग, रूट और नेस्टेड डॉक्स अलग-अलग इकाइयां/टेबल प्रत्येक के साथ अपनी आईडी के साथ होंगे। रूट में नेस्टेड डॉक्टर के साथ कई रिश्ते हो सकते हैं।
  2. मुझे अनुक्रमिक रूप से सीधे नेस्टेड दस्तावेज़ तक पहुंचने की आवश्यकता हो सकती है। मुझे पूर्ण अद्वितीय आईडी की आवश्यकता नहीं हो सकती है, जैसे कि मोंगो द्वारा जारी किए गए, लेकिन मुझे अभी भी कुछ स्थानीय अद्वितीय पहचानकर्ता की आवश्यकता होगी। यह रूट दस्तावेज़ के भीतर अद्वितीय है।

नेस्टेड दस्तावेज़ों में आईडी की आवश्यकता के बारे में मेरा मुद्दा तर्क देने के बाद @ डीक्रॉस्टा ने पहले से ही सही जवाब दिया है कि कैसे mongo में _id फ़ील्ड को पॉप्युलेट करना है।

उम्मीद है कि इससे मदद मिलती है।

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