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#
복사