2013-04-11 4 views
10

MongoDB 문서가 어떤 필드를 예측할 수없는 상황에 있습니다. 따라서 BsonID 유형의 _id 필드가있는 객체를 더 이상 만들 수 없습니다. Dictionary (HashTable)를 만들고 필요한만큼 여러 번 내 DateTime 및 String 객체를 추가하는 것이 매우 편리하다는 것을 알았습니다.C# 드라이버가 포함 된 MongoDB에 사전 삽입

그런 다음 결과 Dictionary 개체를 MongoDb에 삽입하려고 시도하지만 기본 직렬화가 실패합니다.

여기 유형 해시 테이블 내 객체의 (A 사전과 같은,하지만 내부의 다양한 유형) :

{ "_id":"", 
"metadata1":"asaad", 
"metadata2":[], 
"metadata3":ISODate("somedatehere")} 

내가 얻을 드라이버에서 오류입니다 :

시리얼 DictionarySerializer 예상 직렬화 옵션 DictionarySerializationOptions 유형이 아닌 DocumentSerializationOptions

나는 봤지만 아무 것도 찾을 수 없습니다. 유용합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

13

드라이버가 _id 필드를 찾을 수 있어야합니다. Id와 Values의 두 가지 속성 만있는 C# 클래스를 만들 수 있습니다. 우리가 사전 < 문자열을 사용해야

public class HashTableDocument 
{ 
    public ObjectId Id { get; set; } 
    [BsonExtraElements] 
    public Dictionary<string, object> Values { get; set; } 

} 

참고, 대신 해시 테이블의 > 객체.

당신은 다음과 같은 코드를 사용할 수있는 문서에 삽입하려면 다음

> db.test.find().pretty() 
{ 
     "_id" : ObjectId("518abdd4e447ad1f78f74fb1"), 
     "metadata1" : "asaad", 
     "metadata2" : [ ], 
     "metadata3" : ISODate("2013-05-08T21:04:20.895Z") 
} 
> 
+0

화려한이다

var document = new HashTableDocument { Id = ObjectId.GenerateNewId(), Values = new Dictionary<string, object> { { "metadata1", "asaad" }, { "metadata2", new object[0] }, { "metadata3", DateTime.UtcNow } } }; collection.Insert(document); 

우리가 삽입 된 문서가 원하는 형태가 있는지 확인하기 위해 MongoDB의 쉘을 사용할 수 있습니다 , 대단히 감사합니다! –

+0

@RobertStam "동적"필드에 대한 솔루션을 제공합니다. 2 가지 요구 사항 : ** 1) ** 빵집 응용 프로그램에서 사용자는 '브랜드 A, 설탕, 2 (숟가락 포함), 300 (온도 포함), 20 (분 포함)'이라는 자체적 인 규정을 유지하는 것을 선호합니다. 각각에는 열쇠가 없습니다. ** 2) ** 더 많은 독서를 할 때, [매핑 클래스] (http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/)는 또한' IDictionary', 좋아. 그러나 그것은 그 명령을 보존하지 않을 것이라고 말합니다. 질서를 유지하는 방법은 없나요? – Jeb50

관련 문제