AzureCosmosDB에서 UDF, json array의 Pagenation 및 Sort 사용

GYAO의 ts.
우리 팀은 전체 공공 클라우드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 제작입니다.

sort
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);
}

SQL


SQL에 다음과 같은 형식으로 삽입되어 Functions의 통합된 sql로 설정됩니다.
udf를 사용할 때udf입니다.ID를 통해 액세스할 수 있습니다.
SQL
SELECT 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를 선택할 수 있다고 생각합니다.
팀 내에서 상의한 뒤 앞으로 스트레스 테스트 등을 통해 결단을 내리고 싶다.

좋은 웹페이지 즐겨찾기