Проверьте наличие документа с помощью запроса Azure gremlin - PullRequest
0 голосов
/ 30 апреля 2018

Я немного озадачен тем, что должно быть простой задачей, проверить наличие документа с помощью запроса gremlin и, если нет, вставить документ.

С учетом следующей функции:

public static async Task StoreAuditDetail(AuditDetailResponse auditDetail, string endpointUrl, string authorizationKey)
        {
          using (var cosmosClient = new DocumentClient(new Uri(endpointUrl), authorizationKey))
          {
            const string db = "iauditor-database";
            const string collection = "audit-details";
            Uri databaseUri = UriFactory.CreateDatabaseUri(db);
            DocumentCollection graph = cosmosClient.CreateDocumentCollectionIfNotExistsAsync(
              databaseUri,
              new DocumentCollection { Id = collection },
              new RequestOptions { OfferThroughput = 400 }).Result;

            List<dynamic> q1 = cosmosClient.CreateGremlinQuery<dynamic>(graph,
                $"g.V().hasLabel('audit-details').values('audit_id')"
                ).ExecuteNextAsync().Result.ToList();
            if (!q1.Contains(auditDetail.audit_id))
            {
              try
              {
                await cosmosClient.CreateDocumentAsync(graph.DocumentsLink, auditDetail);
              }
              catch (Exception ex)
              {
                throw;
              }
            }
          }
        }

Как вы можете видеть на следующем скриншоте, после первого выполнения документ вставляется как положено: enter image description here

Все выглядит нормально, но, к сожалению, если я попытаюсь перезапустить функцию, я получаю ужасный ответ:

enter image description here

В коллекции идентификаторов всегда пусто, что я делаю не так?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Если вы не предоставите ключ, который хотите запросить, вы не сможете найти этот ключ.

Итак, предоставьте вашему сохраненному объекту ключ, который вы хотели бы найти.

Если вы ищете Vertice, у которого есть ключ в качестве «контрольных данных»:

$"g.V().hasLabel('audit-details')'

CreateDocumentAsync не может быть:

await cosmosClient.CreateDocumentAsync(graph.DocumentsLink, auditDetail);

Это должно быть примерно так:

await cosmosClient.CreateDocumentAsync(graph.DocumentsLink, new { label = "audit-details", detail = auditDetail } );

или лучше:

await cosmosClient.CreateDocumentAsync(graph.DocumentsLink, new { label = "audit-details", id = auditDetail.audit_id, detail = auditDetail } );

Теперь вы можете запрашивать ваш документ по «метке», а также напрямую искать по «ключу»:

public static async Task StoreAuditDetail(AuditDetailResponse auditDetail, string endpointUrl, string authorizationKey)
    {
      using (var cosmosClient = new DocumentClient(new Uri(endpointUrl), authorizationKey))
      {
        const string db = "iauditor-database";
        const string collection = "audit-details";
        Uri databaseUri = UriFactory.CreateDatabaseUri(db);
        DocumentCollection graph = cosmosClient.CreateDocumentCollectionIfNotExistsAsync(
          databaseUri,
          new DocumentCollection { Id = collection },
          new RequestOptions { OfferThroughput = 400 }).Result;

        List<dynamic> q = cosmosClient.CreateGremlinQuery<dynamic>(graph,
            $"g.V().hasLabel('audit-details').values('id')"
            ).ExecuteNextAsync().Result.ToList();

        if (!q.Contains(auditDetail.audit_id))
        {
          try
          {
            await cosmosClient.CreateDocumentAsync(graph.DocumentsLink, new { label = "audit-details", id = auditDetail.audit_id, detail = auditDetail } );
          }
          catch (Exception ex)
          {
            throw;
          }
        }
      }
    }
0 голосов
/ 30 апреля 2018

Я думаю, что проблема из-за асинхронного вызова, переместите ExecuteGremlinQueryAsync в метод и попробуйте

private static async Task ExecuteGremlinQueryAsync(DocumentClient client, DocumentCollection graph, string gremlinCommand)
        {
            IDocumentQuery<dynamic> query = client.CreateGremlinQuery<dynamic>(graph, gremlinCommand);
            while (query.HasMoreResults)
            {
                foreach (dynamic result in await query.ExecuteNextAsync())
                {
                    Console.WriteLine($"\t {JsonConvert.SerializeObject(result)}");
                }
            }

        }

и назовите его

await ExecuteGremlinQueryAsync(client, graph, gremlinCommand);
...