2

我们的团队最近从自托管 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});

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

任何帮助将不胜感激。

4

2 回答 2

0

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

productMapper.getPorductsByColor = productMapper.mapWithQuery(getPorductsByColorQ, params => [ params.color, ]);

我希望在您的模型中添加上述内容可以让您使用

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


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

于 2021-11-19T10:26:26.357 回答
0

最终我们决定使用 Datastax 的 Astra 托管 cassandra - https://www.datastax.com/products/datastax-astra因为它支持 UDT、物化视图和二级索引 - 因此我们没有丢失功能或必须制作完整的数据我们必须使用 AWS Keyspaces 进行建模更改。

于 2021-10-07T17:49:07.157 回答