#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;
}