Nano Hash - криптовалюты, майнинг, программирование

Как запросить вложенный документ (тип списка) в Cosmos Db

У меня есть коллекция в Azure CosmosDB, и каждый документ выглядит так:

{
  "id": "random",
  "TeacherName": "Ben",
  "Students": [
    {
      "Name": "John",
      "Telephone": ""
    },
    {
      "Name": "Mary",
      "Telephone": ""
    }
  ],
}

TeacherName - строка, студенты - это список учеников.

Мне нужно сделать: учитывая имя пользователя (user1), запросить и вернуть все документы, либо имя учителя «user1», либо есть ученик с именем «user1».

Я пробовал несколько вариантов, но не могу.

Ближайшее решение, которое я нашел до сих пор, - использовать .SelectMany(), но я обнаружил, что .SelectMany выполнит соединение и будет дублировать возвращаемые результаты.

Это мой запрос:

client.CreateDocumentQuery().SelectMany((x) => x.Students.Where(s=>s.Name == "user1" || x.TeacherName == "user1")   

Если в коллекции есть только приведенный выше образец документа и когда я искал имя пользователя «Бен», будут возвращены 2 записи ((количество результатов) * (количество студентов)). Мне нужно удалить дубликат на стороне клиента, и разбивка на страницы не работает.

Можно ли выполнить один запрос, чтобы достичь того, что мне нужно?

27.01.2018

Ответы:


1
client.CreateDocumentQuery().SelectMany((x) => x.Students.Where(s=>s.Name == "user1" || x.TeacherName == "user1")

На самом деле метод SelectMany в вашем коде похож на sql, как показано ниже:

SELECT c.id from c
join x  in c.Students
where c.TeacherName ='Ben' or x.Name = 'Ben'

Вывод

[
  {
    "id": "1"
  },
  {
    "id": "1"
  }
]

Если есть соединение, будут повторяющиеся данные. Насколько мне известно, автоматическое удаление повторяющихся данных пока не поддерживается (как Distinct Ключевые слова в традиционной базе данных) в Azure Cosmos DB.

Кажется, что нет возможности удалить повторяющиеся данные на уровне SQL запроса.

Если вы не хотите обрабатывать набор результатов запроса в цикле локально, я настоятельно рекомендую вам использовать хранимая процедура для обработки данных результатов в Azure Cosmos DB, чтобы снизить нагрузку на локальный сервер.

Или вы можете выполнить запрос непосредственно в хранимой процедуре, если ваши данные не слишком велики. См. Код js, как показано ниже:

// SAMPLE STORED PROCEDURE
function sample(idsArrayString,courses) {
    var collection = getContext().getCollection();

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT * FROM root r',
        function (err, feed, options) {
            if (err) throw err;
            if (!feed || !feed.length) getContext().getResponse().setBody('no docs found');
            else {

                var returnResult = [];
                for(var i = 0;i<feed.length;i++){
                    var doc = feed[i];
                    if(doc.TeacherName == 'Ben'){
                        returnResult.push(feed[i]);
                        break;
                    }

                    var std = doc.Students;
                    for (var s in std) {
                        if(s.Name == 'Ben'){
                            returnResult.push(feed[i]);
                            break;
                        }
                    } 
                }
                getContext().getResponse().setBody(returnResult);
            }
        });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

Обновить ответ:

Я проверил сведения о ценах на Azure Cosmos DB. Тогда это не показывает, что хранимая процедура дороже одного запроса. Фактически, стоимость зависит от Rus и RuS зависит от сложности запроса, количества параллелизма и т. Д.

Вы можете обратиться к документу RU. Кроме того, вы можете узнать плату за RU по заголовку HTTP-запроса: x-ms-request-charge. См. Эту полезную трассировку: Как вычислить Azure Cosmos DB RU, используемую в сценариях на стороне сервера.

Надеюсь, это поможет тебе.

27.01.2018
  • Спасибо за ответ. Это очень полезно. Жаль, что cosmoDB все еще не поддерживает Distinct (), и нет простого способа запросить субдокумент. Я рассмотрю возможность использования процедуры хранения, но это довольно дорого по сравнению с одним запросом SQL / запросом ссылки. 29.01.2018
  • @nanzang Привет, нанзанг, пожалуйста, посмотрите мой ответ на обновление. Кстати, вы можете отметить ответ для ссылки других на форуме. Спасибо! 30.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..