2017-08-07 13 views
6

मैं मॉडलस्प्रिंग MongoDB टेम्पलेट एक ही वस्तु में बचत होती है

@CompoundIndexes(value = { 
     @CompoundIndex(name = "catalog_idx", def = "{'code' : 1, 'brand' : 1}", unique = true) }) 
@Document(collection = Catalog.ENTITY) 
public class Catalog extends AbstractModel<String> { 

    private static final long serialVersionUID = 1L; 

    public static final String ENTITY = "catalog"; 

    @NotNull(message = "Code is required") 
    @Field("code") 
    private String code; 

    @NotNull(message = "Brand is required") 
    @DBRef(lazy = true) 
    @Field("brand") 
    private Brand brand; 
} 

निम्नलिखित जब मैं mongoTemplate.save(object); साथ सहेज सकता हूँ मैं 6. के बजाय DB में बनाया से ठीक पहले वस्तुओं के लिए मेरी डिबग लाइनों को बचाने के लिए केवल 2 वस्तुओं को देखने की तरह बचाने होने के लिए।

Catalog [code=StagedCatalog, brand=Brand [code=Brand_3]] 
Catalog [code=StagedCatalog, brand=Brand [code=Brand_2]] 
Catalog [code=StagedCatalog, brand=Brand [code=Brand_1]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_2]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_1]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_3]] 

कोई विचार क्यों? मुझे लगता है कि सूचकांक अद्वितीय चीज किसी भी तरह से काम नहीं कर रही है। मैं code और brandunique combination होना चाहता हूं।

public abstract class AbstractModel<ID extends Serializable> implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private ID id; 
} 
+0

आपके पास कैटलॉग बनाने वाला कोड है? क्या आप अमूर्त मॉडल में "@id" कॉलम रखते हैं? क्या आप इसे भी लॉग कर सकते हैं? – wargre

+0

@ वार्ग्रे ने किया .... –

उत्तर

5

आपने एक अद्वितीय अनुक्रमणिका सेट की है। इसका मतलब है कि आप एक ही कोड और ब्रांड के साथ 2 दस्तावेज रखने में असमर्थ होंगे।

अब आपने आईडी ऑब्जेक्ट में आईडी कॉलम सेट किया है। तथ्य यह है कि आप 6 के बजाय 2 डालने है मतलब है कि आप 3 डालने के लिए एक ही आईडी का उपयोग, कुछ की तरह:

for (code: {"StagedCatalog","OnlineCatalog"}) { 
    ID id=new ID(...); 
    for (brand: {1, 2, 3}){ 
     Catalog cat=new Catalog(); 
     cat.setId(id);    // <<== this is wrong, you reuse the same id, you will insert first brand, then update to brand2 and brand3. 
     cat.setCode(code); 
     cat.setBrand(brand); 
     mongoTemplate.persist(cat); 
    } 
} 

इससे बचने के लिए आप की जरूरत है:

Catalog cat=new Catalog(); 
ID id=new ID(realUniqueId); // RealuniqueId can be code+brand for instance 
cat.setId(id); 
... 
+0

आईडी वसंत mongodb द्वारा सीधे सेट है। –

+0

क्या आप वाकई एक ही ऑब्जेक्ट का पुन: उपयोग नहीं करते हैं? – wargre

+0

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

0

db.collection.save()

अपने दस्तावेज़ पैरामीटर के आधार पर किसी मौजूदा दस्तावेज़ को अपडेट करता है या एक नया दस्तावेज़ सम्मिलित करता है।

Document Structure

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