Разработайте счетную меру количества элементов в свойстве массива 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, и вот мои выводы и результаты по преодолению проблемы:
LEFT JOIN
подход с cube.js присоединяется. Я обнаружил, что это очень медленно и в большинстве случаев заканчивается тайм-аутом, даже когда запросы выполняются через SQL-клиенты командной строки;Запустите mongosqld с флагом --prejoin. Это был лучший вариант, так как
mongosqld
автоматически добавляет мастер столбцы таблицы / свойство вторичных таблиц, таким образом, что позволяет удобно cube.js запроса меры без присоединения вторичного куба;Написал скрипт mongo, который извлекает / повторяет / предварительно вычисляет и сохраняет
nested.arrayPropertyName
считать в отдельном свойстве коллекционных документов.
Вывод
Если исключить вариант 1, вариант 3 значительно превосходит вариант 2, обычно менее секунды против более 20 секунд на моем локальном компьютере. Я сравнил оба варианта с одинаковой мерой, разными диапазонами timeDimension и степенью детализации.
Скорее всего, я включу предварительный расчет количества массивов в логику сохранения внутренней части документа mongo.