2011-01-04 1 views
18

제로입니다. 그래서 그의 주소,MongoDB의 : 자동으로 생성 된 ID는 내가 MongoDB를 간단한 문서를 삽입하는 방법 난 그냥 확인하고있어 0.9</p> <p>작동 공식 C#을 드라이버를 사용하고

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

나는 다른 행을 삽입하고 id가 여전히 000000000000 – cristian

+0

@ Octopus-Paul 인 새로운 행을 검색 할 경우, 맞습니다. – Alex

답변

8

사용 BsonId 속성 :

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

식별하려면 ID 필드 또는 속성을 식별 클래스가 이드가되는 필드 또는 의 재산 당신은 쓸 수 있습니다 :

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

답변을 주셔서 감사합니다.하지만 여전히 0이됩니다 ... – Alex

+1

괜찮은지 확인하겠습니다. –

+0

드라이버 버그와 같습니다. –

24

그것은 충족되지 않은 기대의 경우와 그다지 버그입니다. 최상위 레벨 _id에만 자동으로 값이 지정됩니다. 임베드 된 _id는 클라이언트 코드에 의해 값이 할당되어야합니다 (ObjectId.GenerateNewId 사용). 또한 Address 클래스에 ObjectId가 필요하지 않을 수도 있습니다 (그 목적은 무엇입니까?).

+0

아, 항상 모든 문서에서 ObjectIds가 필수라고 생각했습니다. 이드가 전혀 없다면, 훌륭합니다. Ruby 드라이버는 임베디드 된 문서에 대한 ID를 생성하기 때문에이를 충족시키지 못한 기대는하지 않습니다. – Alex

+1

여기에 문서가 있습니까? 나는 그것에 대해 언급하지 않았다. 루트가 아닌 emdeded 문서를 자동 할당하는 이유는 무엇입니까 (나는 그들이 모두 '문서'라고 생각했습니다)? – UpTheCreek

+0

또한 이러한 방식으로 Comb 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에는 사용자 정의 자동 생성 ID가있는 대체 방법이 있습니다.

관련 문제