Функция Azure C #: создание или замена документа в космос db по HTTP-запросу - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь создать функцию Azure в C #, которая создает новый объект документа в базе данных Azure cosmos, используя SQL API, если идентификатор еще не существует, и обновляет объект документа, если он уже существует.

Контекстом этого является запись истории разговоров чат-ботов в уникальные пользовательские сессии.

Ввод:
HTTP GET-запрос с параметрами (id (строка), chatHistory (строка) и chatDateTime (строка))

Вывод:
Если объект документа с таким же идентификатором уже существует - обновите документ с помощью ввода chatHisotry и chatDateTime.

Если не существует объекта документа с таким же идентификатором, то создайте новый объект документа с id, chatHistory и chatDateTime, равным input.

Любая помощь приветствуется!С этим боролся уже несколько дней.

Пример объекта документа:

{
    "id": "ESCRfAKwlTbH8W5aVRLxgA",
    "chatHistory": "Hi, Hello",
    "chatDateTime": "Fri Sep 21 2018 05:34:35 GMT+0000 (Coordinated Universal Time)",
    "_rid": "RwYSAIqaSVg2AAAAAAAAAA==",
    "_self": "dbs/RwYSAA==/colls/RwYSAIqaSVg=/docs/RwYSAIqaSVg2AAAAAAAAAA==/",
    "_etag": "\"00007400-0000-0000-0000-5ba482ed0000\"",
    "_attachments": "attachments/",
    "_ts": 1537508077
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Можно использовать функции Azure ' Выходная привязка Cosmos DB .Выходная привязка выполняет операцию Upsert .

[FunctionName("HttpTriggerWithSingleDocument")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req,
        [DocumentDB(databaseName: "your-db",
            collectionName: "your-collection",
            ConnectionStringSetting = "CosmosDBConnectionString")] out dynamic documentToSave)
    {
        dynamic data = await req.Content.ReadAsAsync<object>();

        if (data == null)
        {
            documentToSave = null;
            return req.CreateResponse(HttpStatusCode.BadRequest);
        }

        documentToSave = data;

        return req.CreateResponse(HttpStatusCode.Created);
}

Версия портала Azure:

using System.Net;

public static async Task<HttpResponseMessage> Run(
            HttpRequestMessage req,
            IAsyncCollector<dynamic> documentsToStore)
        {
            dynamic data = await req.Content.ReadAsAsync<object>();

            if (data == null)
            {
                return req.CreateResponse(HttpStatusCode.BadRequest);
            }

            await documentsToStore.AddAsync(data);

            return req.CreateResponse(HttpStatusCode.Created);
    }

И вам также необходимо обновить function.json до следующего вида:

{
  "bindings": [
    {
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "documentsToStore",
      "databaseName": "<your-database-name>",
      "collectionName": "<your-collection-name>",
      "createIfNotExists": false,
      "connection": "<your-connection-setting-name>",
      "direction": "out"
    }
  ]
}

Больше образцов доступно здесь: https://github.com/ealsur/serverless-recipes/tree/master/cosmosdboutputbindings

0 голосов
/ 21 сентября 2018

Вот пример, как это сделать.Вам просто нужно настроить его в соответствии с вашими потребностями.

    [FunctionName("Function1")]
    public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req,
    TraceWriter log)
    {
        dynamic data = await req.Content.ReadAsAsync<object>();

        var connectionString = "DbUri";
        var key = "DbKey";

        using (var client = new DocumentClient(new Uri(connectionString), key))
        {
            var collectionLink = UriFactory.CreateDocumentCollectionUri("DbName", "CollectionName");
            await client.UpsertDocumentAsync(collectionLink, data);
        }

        return req.CreateResponse(HttpStatusCode.OK);
    }
...