2016-10-12 3 views
0

는 나는이 항목 ChildDB의 데이터를 DocumentDB에 저장하는 방법은 무엇입니까?

public class SingleItemResponse : Items 
{ 
    public string Id { get; set; } 
} 
public class MultipletemResponse : Items 
{ 
    public IEnumerable<string> Ids { get; set; } 
} 

내가 항목의 목록에 SingleItemResponses 및 MultipleItemResponses의 목록을 추가 한

의 두 서브 클래스가 부모 클래스

public class Items{ 
    public Type FeedType { get; set; } 
    public double Rating { get; set; } 
} 

있습니다.

var list = new List<ItemResponse>(); 
list.add(single); // assume that single is a object of singleItemResponse 
list.add(multiple); // assume that multiple is a object of multipleitem 

나는 singleItemResponse 및 multipleItemResponse의 모든 속성을 가진 목록을 반환 할 수 있습니다. 그러나 documentDB에 저장하고 검색하려고합니다. 문제는 DocumentDB에 IList로 저장하려고 할 때, Single 및 MultipleFeedItems의 값을 유지하지 않습니다.이 경우에는 ID 또는 ID입니다.

어떻게 저장하고 검색 할 수 있는지 알고 싶습니다. 지금 당장 ItemResponse에 추가 할 수있는 유일한 해결책이 있지만 물건을 채우지 않고 더 좋은 방법이 있는지 알고 싶습니다.

+0

당신은'별도로 DocDB의 항목을 _two_하는 _one_ DocumentDB 항목 또는 두 항목에서 단일 및 다중 항목을 포함 list'를 저장하는 의미? 내 대답이 당신의 문제를 지적하지 않는다면 나에게 의견을 적어주세요. – Youngjae

+0

@Youngjae 첫 번째, 하나의 항목과 여러 항목을 포함하는 목록이지만 유형은 기본 유형 –

+0

// 형식으로 설정할 수 있습니다. 확인 해봐. – Youngjae

답변

0

는 방법 1.이 유래 된 객체가 IdIds 같은 구별 특성이있는 경우, 당신은 JObject 먼저 비교 한 다음 유형으로 만들 수 있습니다, 검색의 경우 JSON 계층

을 지속.

string collectionName = "YourCollectionName"; 
Guid id = Guid.Parse("275319a3-d395-46f2-9370-f3eadf691e03"); // Manually set GUID for test purpose. 

Uri documentUri = UriFactory.CreateDocumentUri(DocumentDbDatabaseNameConfig, collectionName, id.ToString()); 
Uri collectionUri = UriFactory.CreateDocumentCollectionUri(DocumentDbDatabaseNameConfig, collectionName); 

// test variables. 
var list = new List<Items>(); 
list.Add(new SingleItemResponse() { Rating = 2.2d, Id = "id" }); 
list.Add(new MultipletemResponse() { Rating = 2.2d, Ids = new List<string>() { "ids1", "ids2"}}); 

JObject jInput = new JObject(); 
jInput.Add("id", id); 
jInput.Add("list", JArray.FromObject(list)); 

// Store data. 
var upsertedResult = _documentDbclient.UpsertDocumentAsync(collectionUri, jInput, null, true).Result; 

// Read stored data. 
var result = _documentDbclient.ReadDocumentAsync(documentUri).Result; 

JObject jResult = (dynamic)result.Resource; 

JArray jArray = (JArray) jResult["list"]; 
foreach (var jElement in jArray) 
{ 
    if (jElement["Id"] != null) 
    { 
     SingleItemResponse single = (SingleItemResponse)jElement.ToObject(typeof(SingleItemResponse)); 
     // Do your job with single instance. 
    } 
    else if (jElement["Ids"] != null) 
    { 
     MultipletemResponse multiple = (MultipletemResponse)jElement.ToObject(typeof(MultipletemResponse)); 
     // Do your job with multiple instance. 
    } 
} 

또한 삽입 된 데이터는 다음과 같습니다. 인라인 JSON 직렬화 된 문자열

이 방법에

{ 
    "id": "275319a3-d395-46f2-9370-f3eadf691e03", 
    "list": [ 
    { 
     "Id": "id", 
     "Rating": 2.2 
    }, 
    { 
     "Ids": [ 
     "ids1", 
     "ids2" 
     ], 
     "Rating": 2.2 
    } 
    ], 
    "_rid": "KywuAN7aNQABAAAAAAAAAA==", 
    "_self": "dbs/KywuAA==/colls/KywuAN7aNQA=/docs/KywuAN7aNQABAAAAAAAAAA==/", 
    "_etag": "\"0000ee05-0000-0000-0000-57ff9ecb0000\"", 
    "_attachments": "attachments/", 
    "_ts": 1476370121 
} 

방법 2 위기는 this post에서 힌트를 얻었다. 내 경험으로는 각 항목에 고유 한 유형이 포함 된 올바른 일련 번호로 된 결과를 만들 수 없습니다. 그러나 이론 상으로는 효과가있을 수 있습니다.

JObject jInput = new JObject(); 

// Use custom serialize/deserialize setting. 
JsonSerializerSettings settings = new JsonSerializerSettings 
{ 
    TypeNameHandling = TypeNameHandling.Auto 
}; 

JArray jArray = JArray.FromObject(list); 
string strJson = JsonConvert.SerializeObject(jArray, settings); 

jInput.Add("id", id); 
jInput.Add("strJson", strJson); // treat json just like strings. 

var upsertedResult = _documentDbclient.UpsertDocumentAsync(collectionUri, jInput, null, true).Result; 

var result = _documentDbclient.ReadDocumentAsync(documentUri).Result; 
JObject jResult = (dynamic)result.Resource; 
jResult.ToString().Dump(); 

List<Items> obj = JsonConvert.DeserializeObject<List<Items>>(jResult["strJson"].Value<string>(), settings);