Как получить набор документов из Cosmos Db из набора идентификаторов

#azure-cosmosdb

#azure-cosmosdb

Вопрос:

Я ищу, чтобы получить элементы из моей коллекции Cosmos Db, и у меня есть список идентификаторов, которые я хочу получить. весь код выполняется в функции Azure, и ниже приведен код, в котором я получаю все идентификаторы в List filteredResult, где я получаю список всех идентификаторов. Я ищу лучший способ завершить этот код, чтобы получить все элементы из моей коллекции Cosmos Db, рассматривая 30-40 идентификаторов одновременно.

  public static void Run([ServiceBusTrigger("testSB", "SubscriberName", Connection = "AzureServiceBusString")] string mySbMsg,
        [CosmosDB(
    databaseName: "DBName",
    collectionName: "CollectionName",
    ConnectionStringSetting = "CosmosDBConnection")] DocumentClient client,
        ILogger log)
    {
        
        try {
             log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");


            
            var jsonSerializerSettings = new JsonSerializerSettings();
            jsonSerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
            List<MyItem> lists = JsonConvert.DeserializeObject<List<MyItem>>(mySbMsg, jsonSerializerSettings);
            List<string> filteredResult = (from s in lists
                                          where s.DocType == "TEST"
                                 select s.Id).ToList();

        }
  

Комментарии:

1. Не уверен, что я полностью понимаю, но … помимо идентификатора, знаете ли вы значение ключа раздела для каждого из документов, которые вы извлекаете? Кроме того: зная идентификатор, у вас есть два варианта: дискретное чтение (по одному на идентификатор) или запрос (где затем вы можете сверить идентификатор каждого документа с массивом известных идентификаторов). Вам нужно будет оценить, какой метод лучше всего подходит для вас, и на производительность повлияет использование ключа раздела (без значения ключа раздела вы в конечном итоге выполните сканирование разделов).

2. что ж, на данный момент у нас есть ключ раздела по умолчанию, и это сам идентификатор. и я буду проверять идентификатор документа из списка из 30 идентификаторов, которые у меня есть. Итак, в термине запроса в Cosmos DB это будет так> (ВЫБЕРИТЕ * ИЗ таблицы, в которой указан идентификатор (список идентификаторов, которые я получаю))

Ответ №1:

Эта проблема недавно была рассмотрена на форуме вопросов и ответов Microsoft. Публикуем ответ здесь снова для более широкого охвата.

Этот код можно использовать после создания ‘filteredResult’ (просто замените список ‘input’ на ‘filteredResult’)

  List<string> input = new List<string>();
             input.Add("1");
             input.Add("2");
             input.Add("3");                
              var option = new FeedOptions { EnableCrossPartitionQuery = true };               
              IQueryable<Family> queryable = client.CreateDocumentQuery<Family>(UriFactory.CreateDocumentCollectionUri("families", "items").ToString(), "SELECT * FROM books where books.id IN "   "('"   string.Join( "','", input)   "')",option);
              List<Family> posts = queryable.ToList();
              Console.WriteLine("Read count = {0}", posts.Count);
  

Также обратите внимание, что я создал класс модели для свойств документа, как показано ниже:

  public class Family
 {
     public int id;
     public string city;
 }