2011-01-04 11 views
18

sıfır bulunmaktadır. bu yüzden onun adresi,MongoDB: Otomatik olarak oluşturulan kimlikleri ben MongoDB ve basit belgeleri gömme nasıl Sadece kontrol ediyorum 0.9</p> <p>işleri resmi C# sürücüsü kullanıyorum

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

collection.Insert(user.ToBsonDocument()); 

kullanıcı başarıyla kaydedildi:

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; } 
} 

Ben yeni bir kullanıcı oluşturun:

2 kolay sınıfları vardır.

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

Neden adresi nesne kimliği 0:

MongoDB kabuğunda

db.users.find() 

yazdıktan sonra ben şu sonucu var? adresle sorguları yapmak

olsa çalışır:

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

Bu kullanıcı "Sam" döndürür.

+0

Bir varsayım yapıyorum: başka bir satır eklerseniz ve yeni satırı alırsanız, kimlik hala 000000000000 – cristian

+0

@ Octopus-Paul'dur, evet bu doğrudur. – Alex

cevap

8

Kullanım BsonId özellik:

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

belirlemek için Id alanı veya özelliği belirlenmesi bir sınıf Kimliği hangi alanı veya malı yazabilirsiniz:

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

Driver Tutorial

Aslında çalışmıyor

Düzen. Daha sonra neden kontrol edeceğim. bunu şu kullanımını işe almak gerekirse:

[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

Cevabınız için teşekkürler, ama hala sıfırlarım var ... – Alex

+1

tamam kontrol edeyim. –

+0

Sürücü hatası gibi görünüyor. –

24

Bu karşılanmayan beklentiler bir vaka olarak çok değil bir sinek. Sadece en üst düzey _id'e otomatik olarak bir değer atanır. Tüm gömülü _idler, istemci kodu tarafından değer atanmalıdır (ObjectId.GenerateNewId kullanın). Ayrıca, Adres sınıfında bir ObjectId'ye bile ihtiyacınız yoktur (bunun amacı nedir?).

+0

özniteliği var, her zaman ObjectIds tüm belgeler için zorunlu olduğunu düşündüm. Kimliksiz olmanın sakıncası yoksa, o zaman harika. Beklenmedik beklentiler demezdim, örneğin, Ruby sürücüsü gömülü belgeler için kimlikler oluşturur. – Alex

+1

Bu bir yerde belgelenmiş mi? Bundan hiç bahsetmedim. Kökenin otomatik olarak yazdırılmasının ardındaki mantık nedir, ancak belgelendirilmemiş dokümanlar (bunların hepsi "belge" olduklarını düşündüm)? – UpTheCreek

+0

Ayrıca, Comb GUID jeneratörü bu şekilde kullanmanın herhangi bir yolu? – UpTheCreek

2

Kullanıcı türü olarak toplama alın: otomatik olacak

collection.InsertOne(user); 

_ID alanı:

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

Sonra nesneyi eklemek şöyledir:

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

alan _ID başlat oluşturulmalı.

Bu link'da, otomatik olarak oluşturulmuş kimlikleri tanıtmak için alternatif yollar bulacaksınız.

İlgili konular