Cassandra 有没有办法在插入时忽略聚簇键?
Is there a way for Cassandra to ignore clustering key when inserting?
现在我有一个包含三列的 table:GroupId
、ObjectId
和 Data
,前两个定义为分区键。
目前它按预期工作:如果 GroupId
和 ObjectId
匹配现有行,它会被覆盖。
我正在尝试添加按日期排序,因此我添加了第三列 LastModified
并将其指定为聚类键。虽然它适用于排序,但现在我有多行共享相同的 GroupId
和 ObjectId
对,这不是我需要的。
我怎样才能实现以前的行为?
- 我可以在写入之前阅读 table 并在写入新行之前删除匹配行。
- 阅读后,我可以过滤我的应用程序中的行。
我不喜欢这两种解决方案,因为它们似乎太复杂,而且性能是一个大问题。有没有更好的方法?
如果其他人遇到同样的问题,我是这样做的:
我有一个 table,其中 GroupId
和 ObjectId
作为键。我不确定这是否重要,但 ObjectId
被定义为聚类键。
然后您将从以下视图中获得所需的结果:
CREATE MATERIALIZED VIEW IF NOT EXISTS objectlistbylast
AS SELECT * FROM objectlist
WHERE groupid IS NOT NULL AND objectid IS NOT NULL AND lastmodified IS NOT NULL
PRIMARY KEY(groupid , lastmodified, objectid )
WITH CLUSTERING ORDER BY(lastmodified DESC);
注意定义主键时的顺序很重要。
现在我有一个包含三列的 table:GroupId
、ObjectId
和 Data
,前两个定义为分区键。
目前它按预期工作:如果 GroupId
和 ObjectId
匹配现有行,它会被覆盖。
我正在尝试添加按日期排序,因此我添加了第三列 LastModified
并将其指定为聚类键。虽然它适用于排序,但现在我有多行共享相同的 GroupId
和 ObjectId
对,这不是我需要的。
我怎样才能实现以前的行为?
- 我可以在写入之前阅读 table 并在写入新行之前删除匹配行。
- 阅读后,我可以过滤我的应用程序中的行。
我不喜欢这两种解决方案,因为它们似乎太复杂,而且性能是一个大问题。有没有更好的方法?
如果其他人遇到同样的问题,我是这样做的:
我有一个 table,其中 GroupId
和 ObjectId
作为键。我不确定这是否重要,但 ObjectId
被定义为聚类键。
然后您将从以下视图中获得所需的结果:
CREATE MATERIALIZED VIEW IF NOT EXISTS objectlistbylast
AS SELECT * FROM objectlist
WHERE groupid IS NOT NULL AND objectid IS NOT NULL AND lastmodified IS NOT NULL
PRIMARY KEY(groupid , lastmodified, objectid )
WITH CLUSTERING ORDER BY(lastmodified DESC);
注意定义主键时的顺序很重要。