Search
Duplicate
🗃

Cosmos DB C#에서 사용하기

DB연결

_client = new DocumentClient(new Uri(Config.Instance.CosmosEndPoint), "기본키"); await _client.CreateDatabaseIfNotExistsAsync(new Database { Id = "wjmg_cosmos" }); await _client.CreateDocumentCollectionIfNotExistsAsync(UriFactory.CreateDatabaseUri(_databaseName), new DocumentCollection { Id = "TESTDATA", PartitionKey = new PartitionKeyDefinition { Paths = new Collection<string> { "/CharactorId" } } });
C#
복사
CosmosEndPoint는 개요 항목에 URI EndPoint.
기본키는 CosmosDb의 Key항목에서 발급

데이터 정의

public class TestData { [JsonProperty(PropertyName = "id")] public string Id { get; set; } public int CharactorId { get; set; } public int WeaponId { get; set; } public override string ToString() { return JsonConvert.SerializeObject(this); } }
C#
복사
저장하는 json형식에 대한 정의
id로 사용할 항목을 반드시 지정해야 하며 PropertyName으로 id를 지정해주는 필드의 이름은 꼭 Id일 필요는 없다.
id로 사용되는 값은 Auto Increment로 지정도 안되고 자동 생성도 되지 않으므로 스스로 고유한 값을 만들어 수동 생성해야한다.

데이터 가져오기

단일 데이터 가져오기
public async Task<TestData> GetTestData(long uid, int CharatorId) { try { var readDocument = await _client.ReadDocumentAsync<TestData>(UriFactory.CreateDocumentUri(_databaseName, "TESTDATA", $"{uid}"), new RequestOptions() { PartitionKey = new PartitionKey(CharatorId) }); return readDocument; } catch (DocumentClientException de) { if (de.StatusCode == HttpStatusCode.NotFound) { return null; } else { LogSystem.Instance.RegistLog($"Error: {de.Message}, Message: {de.Message}", SYSTEM_LOG_LEVEL.CRITICAL); } } catch (Exception e) { var baseException = e.GetBaseException(); LogSystem.Instance.RegistLog($"Error: {e.Message}, Message: {baseException.Message}", SYSTEM_LOG_LEVEL.CRITICAL); } return null; }
C#
복사
쿼리하여 가져오기
public bool GetTestDatas(int charatorId, out List<TestData> results) { try { var collectionLink = UriFactory.CreateDocumentCollectionUri(_databaseName, "TESTDATA"); var query = new SqlQuerySpec( "SELECT TOP 10 * FROM TESTDATA c WHERE c.CharatorId = @charatorIndex ORDER BY c._ts DESC", new SqlParameterCollection(new[] { new SqlParameter { Name = "@charatorIndex", Value = charatorId } })); results = _client.CreateDocumentQuery<TestData>(collectionLink, query) //.Where(p => p.CharatorId == charatorId) .ToList(); return true; } catch (DocumentClientException de) { results = null; return de.StatusCode == HttpStatusCode.NotFound; } catch (Exception e) { var baseException = e.GetBaseException(); LogSystem.Instance.RegistLog($"Error: {e.Message}, Message: {baseException.Message}", SYSTEM_LOG_LEVEL.CRITICAL); } results = null; return false; }
C#
복사
위의 쿼리는 최근에 캐릭터ID에 해당하는 캐릭터를 만든 10개의 데이터를 가져오는 커리.

데이터 저장하기

public async Task SaveTestData(long uid, int charatorId, int weaponId) { var testData = new TestData { Id = $"{uid}", CharatorId = charatorId, WeaponId = weaponId }; try { await _client.ReadDocumentAsync(UriFactory.CreateDocumentUri(_databaseName, "TESTDATA", testData.Id), new RequestOptions() { PartitionKey = new PartitionKey(testData.CharatorId)//(Undefined.Value) }); LogSystem.Instance.RegistLog($"Found {testData.Id}"); await _client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(_databaseName, "TESTDATA", testData.Id), testData); LogSystem.Instance.RegistLog($"Test Data {testData.Id}"); } catch (DocumentClientException de) { if (de.StatusCode == HttpStatusCode.NotFound) { await _client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(_databaseName, "TESTDATA"), testData); LogSystem.Instance.RegistLog($"Created Replay Data {testData.Id}"); } } catch (Exception e) { var baseException = e.GetBaseException(); LogSystem.Instance.RegistLog($"Error: {e.Message}, Message: {baseException.Message}", SYSTEM_LOG_LEVEL.CRITICAL); } }
C#
복사