2011-01-04 20 views
18

मैं MongoDB और अधिकारी सी # चालक 0.9MongoDB: स्वचालित रूप से उत्पन्न आईडी शून्य

मैं बस कैसे सरल दस्तावेज़ एम्बेड जाँच कर रहा हूँ काम करता है का उपयोग कर रहा है। ,

var user = new User 
{ 
    Name = "Sam", 
    Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET" } }) 
}; 

collection.Insert(user.ToBsonDocument()); 

उपयोगकर्ता को सफलतापूर्वक सहेजा जाता है तो उसका पता है:

public class User 
{ 
    public ObjectId _id { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<Address> Addresses { get;set; } 
} 

public class Address 
{ 
    public ObjectId _id { get; set; } 
    public string Street { get; set; } 
    public string House { get; set; } 
} 

मैं एक नया उपयोगकर्ता बनाने:

2 आसान वर्गों रहे हैं।

{ "_id" : ObjectId("4e572f2a3a6c471d3868b81d"), "Name" : "Sam", "Addresses" : [ 
     { 
       "_id" : ObjectId("000000000000000000000000"), 
       "Street" : "BIGSTREET", 
       "House" : "BIGHOUSE" 
     } 
] } 

क्यों है पता 'ऑब्जेक्ट id 0:

MongoDB खोल में

db.users.find() 

लिखने के बाद, मैं निम्नलिखित परिणाम मिला?

पते के साथ प्रश्नों कर हालांकि काम करता है:

collection.FindOne(Query.EQ("Addresses.Street", streetName)); 

यह "सैम" उपयोगकर्ता देता है।

+0

मैं एक धारणा करता हूं: यदि आप एक और पंक्ति डालते हैं, और आप नई पंक्ति पुनर्प्राप्त करते हैं तो आईडी अभी भी 000000000000 – cristian

+0

@ ऑक्टोपस-पॉल, हाँ यह सही है। – Alex

उत्तर

8

उपयोग BsonId विशेषता:

public class Address 
{ 
    [BsonId] 
    public string _id { get; set; } 
    public string Street { get; set; } 
    public string House { get; set; } 
} 

ईद क्षेत्र या संपत्ति

पहचान करने के लिए की पहचान करना है जो क्षेत्र या की संपत्ति एक वर्ग आईडी है आप लिख सकते हैं:

public class MyClass { 
    [BsonId] 
    public string SomeProperty { get; set; } 
} 

Driver Tutorial

संपादित

यह वास्तव में काम नहीं कर रहा। मैं बाद में जांच करूंगा क्यों। आप इसका अनुसरण उपयोग काम पाने की जरूरत है:

[Test] 
    public void Test() 
    { 
     var collection = Read.Database.GetCollection("test"); 

     var user = new User 
     { 
      Name = "Sam", 
      Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET", _id = ObjectId.GenerateNewId().ToString() } }) 
     }; 

     collection.Insert(user.ToBsonDocument()); 
    } 
+0

उत्तर के लिए धन्यवाद, लेकिन मुझे अभी भी शून्य मिलती है ... – Alex

+1

ठीक है मुझे चेक करने दें। –

+0

ड्राइवर बग की तरह दिखता है। –

24

यह इतना unmet की उम्मीदों का एक मामले के रूप में एक बग नहीं है। केवल शीर्ष स्तर _id स्वचालित रूप से एक मान असाइन किया जाता है। किसी भी एम्बेडेड _ids को क्लाइंट कोड द्वारा ऑब्जेक्ट असाइन किया जाना चाहिए (ObjectId.GenerateNewId का उपयोग करें)। यह भी संभव है कि आपको पता वर्ग में ऑब्जेक्ट आईडी की भी आवश्यकता न हो (इसका उद्देश्य क्या है?)।

+0

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

+1

क्या यह कहीं दस्तावेज है? मैंने इसका कोई उल्लेख नहीं देखा है। जड़ को स्वत: सौंपने के पीछे तर्क क्या है, लेकिन एम्बेडेड दस्तावेज़ नहीं (मैंने सोचा कि वे सभी 'दस्तावेज़' थे)? – UpTheCreek

+0

इसके अलावा, इस तरह से कंघी GUID जनरेटर का उपयोग करने का कोई भी तरीका? – UpTheCreek

2

उपयोगकर्ता प्रकार के रूप में संग्रह प्राप्त करें: स्वचालित रूप से

collection.InsertOne(user); 

_ id फ़ील्ड:

var user = new User 
{ 
    _id = ObjectId.Empty, 
    Name = "Sam", 
    Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET" } }) 
}; 

तो फिर तुम ऑब्जेक्ट सम्मिलित:

var collection = db.GetCollection<User>("users"); 

इस प्रकार क्षेत्र _ id प्रारंभ उत्पन्न हो जाओ।

इस link में आपको अनुकूलित ऑटो-जेनरेटेड आईडी (ओं) के वैकल्पिक तरीके मिलेंगे।

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