AzureCosmosDB에서 UDF, json array의 Pagenation 및 Sort 사용
우리 팀은 전체 공공 클라우드Microservice Architecture의 다음 백엔드를 사용하도록 설계하고 있다.
거치다
마지막 게시물, Eventhubs를 통해 등록할 수 있기 때문에 이후 검색 기능을 만들지 않기 때문에 AzureFunctions에 Sort와 Pagenation이 있는 검색 API를 설치했습니다.
하고 싶은 일
다음 데이터는 CosmosDB에 저장됩니다.
ID-user1{
"Contents": [
{
"ContentsId": "c0001",
"Time": 1500532318
},
{
"ContentsId": "c0006",
"Time": 1500535647
},
{
"ContentsId": "c0002",
"Time": 1500538621
}
],
"Pkey": "reserve",
"id": "user1"
}
이 콘텐츠에서 타임(unix timestamp) 순서대로 정렬하고 Pagenation(start,end)으로 축소하고 싶습니다.
AzureForum만 보면 현재 탑의 지지만 있는 것 같다.이렇게 하면 페이지를 넘길 수 없다.
그리고 이번에는 한 문서의 Array의 nested 대상의 Sort와 Pagenation이기 때문에 원래 용도가 다른 것 같아서...
우리는 Azure Cosmos DB의 UDF(user defined functions)를 사용하여 제작하기로 결정했다.
udf로 제작하여 functions에 설정된 SQL에 삽입하는 형식으로 진행합니다.
실시
UDF
우선 UDF 제작입니다.
sortfunction sort(contents, start, end, sort) {
function compareTime(a, b) {
if (sort == 'DESC') {
return b.Time - a.Time;
}
else{
return a.Time - b.Time;
}
}
return contents.sort(compareTime).slice(start, end);
}
SQL
SQL에 다음과 같은 형식으로 삽입되어 Functions의 통합된 sql로 설정됩니다.
udf를 사용할 때udf입니다.ID를 통해 액세스할 수 있습니다.
SQLSELECT c.id, c.Pkey, udf.sort(c.Contents, {start}, {end}, {order}) as Contents FROM c where c.id = {docId}
Functions
아래와 같다.
합병은 이런 느낌이에요.
http-input 루트 템플릿에서 필요한 매개 변수 설정 얻기
직접 매개변수로 설정합니다.
참고 사항은 inDocuments를 IENumerable 형식으로 설정하는 것입니다.
SQL로 취득한 경우 ID 지정이라도 여러 문서에 국한됩니다.
Functions#r "Newtonsoft.Json"
using System;
using System.Net;
using Newtonsoft.Json;
public class Input
{
public string docId { get; set; }
}
public static HttpResponseMessage Run(Input input, int start, int end, string order,
HttpRequestMessage req, IEnumerable<dynamic> inputDocuments, TraceWriter log)
{
var inputDocument = inputDocuments.First();
log.Info($"invoked. start:{start}. limit:{end}. order:{order}");
if (inputDocument != null)
{
var responseContent = JsonConvert.SerializeObject(inputDocument);
var response = req.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(responseContent, Encoding.UTF8, "application/json");
return response;
}
else
{
//not found. do nothing.
return req.CreateResponse(HttpStatusCode.NotFound);
}
}
이상
Test
테스트 표가 임의로 응용되다.편리하다
가져오기 완료.시원하게 갔다.start와end만 있으면 편의성이 좋지 않을 수 있으므로limit과offset이 좋습니다.
어쨌든 원형은 다 됐어.
느끼다
성능에 대해서는 여전히 궁금증이 있지만, 지금은 이렇게 할 수 있거나, Functions 내 C#에서 Sort를 선택할 수 있다고 생각합니다.
팀 내에서 상의한 뒤 앞으로 스트레스 테스트 등을 통해 결단을 내리고 싶다.
Reference
이 문제에 관하여(AzureCosmosDB에서 UDF, json array의 Pagenation 및 Sort 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tstakano-yj/items/e47a2d82ae995b26d44e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
다음 데이터는 CosmosDB에 저장됩니다.
ID-user1
{
"Contents": [
{
"ContentsId": "c0001",
"Time": 1500532318
},
{
"ContentsId": "c0006",
"Time": 1500535647
},
{
"ContentsId": "c0002",
"Time": 1500538621
}
],
"Pkey": "reserve",
"id": "user1"
}
이 콘텐츠에서 타임(unix timestamp) 순서대로 정렬하고 Pagenation(start,end)으로 축소하고 싶습니다.AzureForum만 보면 현재 탑의 지지만 있는 것 같다.이렇게 하면 페이지를 넘길 수 없다.
그리고 이번에는 한 문서의 Array의 nested 대상의 Sort와 Pagenation이기 때문에 원래 용도가 다른 것 같아서...
우리는 Azure Cosmos DB의 UDF(user defined functions)를 사용하여 제작하기로 결정했다.
udf로 제작하여 functions에 설정된 SQL에 삽입하는 형식으로 진행합니다.
실시
UDF
우선 UDF 제작입니다.
sortfunction sort(contents, start, end, sort) {
function compareTime(a, b) {
if (sort == 'DESC') {
return b.Time - a.Time;
}
else{
return a.Time - b.Time;
}
}
return contents.sort(compareTime).slice(start, end);
}
SQL
SQL에 다음과 같은 형식으로 삽입되어 Functions의 통합된 sql로 설정됩니다.
udf를 사용할 때udf입니다.ID를 통해 액세스할 수 있습니다.
SQLSELECT c.id, c.Pkey, udf.sort(c.Contents, {start}, {end}, {order}) as Contents FROM c where c.id = {docId}
Functions
아래와 같다.
합병은 이런 느낌이에요.
http-input 루트 템플릿에서 필요한 매개 변수 설정 얻기
직접 매개변수로 설정합니다.
참고 사항은 inDocuments를 IENumerable 형식으로 설정하는 것입니다.
SQL로 취득한 경우 ID 지정이라도 여러 문서에 국한됩니다.
Functions#r "Newtonsoft.Json"
using System;
using System.Net;
using Newtonsoft.Json;
public class Input
{
public string docId { get; set; }
}
public static HttpResponseMessage Run(Input input, int start, int end, string order,
HttpRequestMessage req, IEnumerable<dynamic> inputDocuments, TraceWriter log)
{
var inputDocument = inputDocuments.First();
log.Info($"invoked. start:{start}. limit:{end}. order:{order}");
if (inputDocument != null)
{
var responseContent = JsonConvert.SerializeObject(inputDocument);
var response = req.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(responseContent, Encoding.UTF8, "application/json");
return response;
}
else
{
//not found. do nothing.
return req.CreateResponse(HttpStatusCode.NotFound);
}
}
이상
Test
테스트 표가 임의로 응용되다.편리하다
가져오기 완료.시원하게 갔다.start와end만 있으면 편의성이 좋지 않을 수 있으므로limit과offset이 좋습니다.
어쨌든 원형은 다 됐어.
느끼다
성능에 대해서는 여전히 궁금증이 있지만, 지금은 이렇게 할 수 있거나, Functions 내 C#에서 Sort를 선택할 수 있다고 생각합니다.
팀 내에서 상의한 뒤 앞으로 스트레스 테스트 등을 통해 결단을 내리고 싶다.
Reference
이 문제에 관하여(AzureCosmosDB에서 UDF, json array의 Pagenation 및 Sort 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tstakano-yj/items/e47a2d82ae995b26d44e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
function sort(contents, start, end, sort) {
function compareTime(a, b) {
if (sort == 'DESC') {
return b.Time - a.Time;
}
else{
return a.Time - b.Time;
}
}
return contents.sort(compareTime).slice(start, end);
}
SELECT c.id, c.Pkey, udf.sort(c.Contents, {start}, {end}, {order}) as Contents FROM c where c.id = {docId}
#r "Newtonsoft.Json"
using System;
using System.Net;
using Newtonsoft.Json;
public class Input
{
public string docId { get; set; }
}
public static HttpResponseMessage Run(Input input, int start, int end, string order,
HttpRequestMessage req, IEnumerable<dynamic> inputDocuments, TraceWriter log)
{
var inputDocument = inputDocuments.First();
log.Info($"invoked. start:{start}. limit:{end}. order:{order}");
if (inputDocument != null)
{
var responseContent = JsonConvert.SerializeObject(inputDocument);
var response = req.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(responseContent, Encoding.UTF8, "application/json");
return response;
}
else
{
//not found. do nothing.
return req.CreateResponse(HttpStatusCode.NotFound);
}
}
테스트 표가 임의로 응용되다.편리하다
가져오기 완료.시원하게 갔다.start와end만 있으면 편의성이 좋지 않을 수 있으므로limit과offset이 좋습니다.
어쨌든 원형은 다 됐어.
느끼다
성능에 대해서는 여전히 궁금증이 있지만, 지금은 이렇게 할 수 있거나, Functions 내 C#에서 Sort를 선택할 수 있다고 생각합니다.
팀 내에서 상의한 뒤 앞으로 스트레스 테스트 등을 통해 결단을 내리고 싶다.
Reference
이 문제에 관하여(AzureCosmosDB에서 UDF, json array의 Pagenation 및 Sort 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tstakano-yj/items/e47a2d82ae995b26d44e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(AzureCosmosDB에서 UDF, json array의 Pagenation 및 Sort 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tstakano-yj/items/e47a2d82ae995b26d44e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)