MongoDB 数组 属性 in cube.js 中元素个数的计数度量设计

Design a counting measure of the element number in a MongoDB array property in cube.js

我正在使用 cube.js with MongoDB through MongoDB Connector for BI and MongoBI Driver,到目前为止一切顺利。我想要一个 cube.js 数值 measure 来计算 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'

任何 help/advice 真的很感激。谢谢

BI 将嵌套数组视为单独的关系 table。参见 https://www.mongodb.com/blog/post/introducing-the-mongodb-connector-for-bi-20

这就是您收到未知列错误的原因,它不是父文档的一部分 table。

所以我猜你必须在嵌套数组上构建架构,然后在父对象 ID 上构建带有维度的度量计数。

希望它停止。

我听从了 Michael Parshin's 的建议,下面是我解决问题的发现和结果:

  1. LEFT JOIN 接近 cube.js joins。我发现它非常慢,而且大多数时候它会以超时结束,即使是通过命令行 SQL 客户端执行查询;

  2. 启动 mongosqld with --prejoin flag. That was a better option since mongosqld automatically adds master table columns/properties to the secondary tables thus enabling you to conveniently query cube.js measures without joining a secondary Cube;

  3. 写了一个 mongo 脚本,fetch/iterate/precalc 并在单独的 属性 集合文档中坚持 nested.arrayPropertyName 计数。

结论

不考虑选项 1,选项 3 明显优于选项 2,通常不到 1 秒,而在我的本地计算机上则超过 20 秒。我比较了具有相同 measure, different timeDimension 范围和粒度的两个选项。

我很可能会将数组计数预计算合并到 mongo 文档后端持久化逻辑中。