मुझे इसी तरह की समस्या का सामना करना पड़ा है। मैं आधिकारिक सी # ड्राइवर का उपयोग कर दस्तावेजों को ऊपर उठाना चाहता था। मेरे पास इस तरह की एक कक्षा थी:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
कंसोल में मैं लिखूंगा:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
और यह काम करेगा। सी#में मैंने लिखा:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
और यह काम नहीं किया! क्योंकि ड्राइवर में अपडेट स्टेटमेंट में खाली आईडी शामिल होती है और जब मैं दूसरे दस्तावेज़ को फ़ील्ड 1 अपवाद के विभिन्न मान के साथ ऊपर रखता हूं E11000 duplicate key error index
फेंक दिया जाता है (इस मामले में मोंगो _id के साथ एक दस्तावेज़ सम्मिलित करने का प्रयास करता है जो पहले से ही डीबी में मौजूद है)।
जब मैंने खुद से _id जनरेट किया (जैसे विषय स्टार्टर) मुझे उसी अपवाद का सामना करना पड़ा (mongo cannot change _id of a document
) फ़ील्ड1 के मौजूदा मान वाली वस्तुओं को ऊपर करने पर।
समाधान आईडी संपत्ति को विशेषता द्वारा चिह्नित करना है [BsonIgnoreIfDefault]
(और इसे प्रारंभ नहीं करें)। इस मामले में ड्राइवर अपडेट स्टेटमेंट में _id फ़ील्ड को छोड़ देता है और यदि आवश्यक हो तो MongoDb आईडी जेनरेट करता है।