Разработайте счетную меру количества элементов в свойстве массива MongoDB в cube.js

Я использую cube.js с MongoDB через MongoDB Connector for BI и MongoBI Driver, и пока все хорошо. Я хотел бы иметь числовую меру cube.js, которая подсчитывает длину элемента из массива MongoDB вложенного свойства объекта. Что-то типа:

{
  "nested": {
    "arrayPropertyName": [
      {
        "name": "Leatha Bauch",
        "email": "Leatha.Bauch76@hotmail.com"
      },
      {
        "name": "Pedro Hermiston",
        "email": "Pedro76@hotmail.com"
      }
    ]
  }
}

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

Я пробовал с type: count:

    MyNestedArrayPropertyCounter: {
      sql: `${CUBE}.\`nested.arrayPropertyName\``,
      type: `count`,
      format: `number`,
    },

но я получаю

Error: Error: Unknown column 'nested.arrayPropertyName' in 'field list'

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

2 ответа

Решение

BI рассматривает вложенные массивы как отдельные реляционные таблицы. См. https://www.mongodb.com/blog/post/introducing-the-mongodb-connector-for-bi-20

Вот почему вы получаете ошибку неизвестного столбца, он не является частью таблицы родительского документа.

Итак, я предполагаю, что вам нужно построить схему во вложенном массиве, а затем построить счетчик мер с измерением по идентификатору родительского объекта.

Надеюсь, это остановится.

Я последовал совету Michael Parshin, и вот мои выводы и результаты по преодолению проблемы:

  1. LEFT JOINподход с cube.js присоединяется. Я обнаружил, что это очень медленно и в большинстве случаев заканчивается тайм-аутом, даже когда запросы выполняются через SQL-клиенты командной строки;

  2. Запустите mongosqld с флагом --prejoin. Это был лучший вариант, так какmongosqldавтоматически добавляет мастер столбцы таблицы / свойство вторичных таблиц, таким образом, что позволяет удобно cube.js запроса меры без присоединения вторичного куба;

  3. Написал скрипт mongo, который извлекает / повторяет / предварительно вычисляет и сохраняет nested.arrayPropertyName считать в отдельном свойстве коллекционных документов.

Вывод

Если исключить вариант 1, вариант 3 значительно превосходит вариант 2, обычно менее секунды против более 20 секунд на моем локальном компьютере. Я сравнил оба варианта с одинаковой мерой, разными диапазонами timeDimension и степенью детализации.

Скорее всего, я включу предварительный расчет количества массивов в логику сохранения внутренней части документа mongo.

Другие вопросы по тегам