【问题标题】:Cassandra Node.js driver - possible to toggle ALLOW FILTERING?Cassandra Node.js 驱动程序 - 可以切换允许过滤吗?
【发布时间】:2021-06-18 00:13:29
【问题描述】:

我们的团队最近从自托管 Cassandra 切换到 AWS Keyspaces。 尽管“手册”提到了 Cassandra 的兼容性,但我们实际上正在失去一些 Cassandra 最关键的功能(包括重要的功能 - UDT、物化视图和二级索引)。

但对我们来说,切换仍然值得,因为对于一个小团队来说,自我维护的 Cassandra 开销太大。

作为迁移计划的一部分,我们决定在绝对需要的情况下将物化视图替换为自我维护的表,其余部分用 ALLOW FILTERING 替换,我们认为在接下来的 6 到 12 个月内对性能的影响将很小,希望 Keyspaces 将添加对 MV 的支持,或者通过使用 Spark、Elassandra 或类似工具实现搜索端点。

我们正在使用带有对象映射的 Node.js Datastax Cassandra 驱动程序。因此,我们希望保持这种方式,而不是使用原始 CQL 查询。 但是,当尝试使用映射器运行查询时,我们似乎无法使 ALLOW FILTERING 功能正常工作。

我们在 Node.js 和 express 中使用以下设置。

import {Client, mapping, auth, types} from "cassandra-driver";

const fs = require('fs');
const authProvider = new auth.PlainTextAuthProvider(process.env.CASSANDRA_USER!, process.env.CASSANDRA_PWD!);
const sslOptions1 = {
  cert: fs.readFileSync('AmazonRootCA1.pem'),
  host: 'cassandra.us-east-1.amazonaws.com',
  rejectUnauthorized: true
};

export const client = new Client({
  contactPoints: ['cassandra.us-east-1.amazonaws.com:9142'],
  localDataCenter: 'us-east-1',
  authProvider: authProvider,
  sslOptions: sslOptions1,
  protocolOptions: { port: 9142 },
  queryOptions: { consistency: types.consistencies.localQuorum,  }
});

// table mapper
export const mapper: mapping.Mapper = new mapping.Mapper(client, {
    models: {
        products: {
            tables: ["products"],
            keyspace: "store"
        }
    }
});

到目前为止一切顺利。

问题是映射器方法似乎不支持“允许过滤”。

所以,这行得通 -

await client.execute(
        'SELECT * FROM store.products where color = :color ALLOW FILTERING',
        { color: 'red' },
        { prepare: true }
      );

但是,当使用映射器时,似乎没有办法切换允许过滤选项

let productMapper = mapper.forModel("products");
const product: Product = await this.productMapper.find({color: 'red'});

理想情况下会有一个运行选项

this.productMapper.find({color: 'red'}, {allow_filtering: true});

搜索文档不会显示任何相关选项。

任何帮助将不胜感激。

【问题讨论】:

    标签: node.js cassandra amazon-keyspaces datastax-node-driver


    【解决方案1】:

    最终我们决定使用 Datastax 的 Astra 托管的 cassandra - https://www.datastax.com/products/datastax-astra,因为它支持 UDT、物化视图和二级索引 - 因此我们没有失去功能或不得不进行我们必须通过使用来完成的完整数据建模更改AWS 密钥空间。

    【讨论】:

      【解决方案2】:

      const getPorductsByColorQ = 'SELECT * FROM store.products where color = :color ALLOW FILTERING';

      productMapper.getPorductsByColor = productMapper.mapWithQuery(getPorductsByColorQ, params => [ 参数.颜色, ]);

      我希望在你的模型中添加上面可以让你使用

      productMapper.getPorductsByColor( { color: 'red' });


      以上代码可帮助您添加自定义查询并像函数一样调用它

      【讨论】:

      • 您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。
      猜你喜欢
      • 2017-07-23
      • 2019-01-13
      • 2023-03-10
      • 2015-05-07
      • 2020-10-12
      • 2016-07-16
      • 2021-09-10
      • 2011-10-23
      • 2016-08-14
      相关资源
      最近更新 更多