【发布时间】:2014-07-23 15:21:17
【问题描述】:
我对 Cassandra 很陌生,我创建了一个这样的表:
CREATE TABLE IF NOT EXISTS notifications (
id uuid,
raised timeuuid,
recorded timeuuid,
customer varchar,
region varchar,
location varchar,
operator varchar,
till varchar,
receipt_id varchar,
value decimal,
details text,
is_refund boolean,
has_promos boolean,
utc_offset int,
frame_count int,
expecting_video boolean,
PRIMARY KEY (id, raised)
) WITH CLUSTERING ORDER BY (raised desc);
然后像这样从 DataStax .NET Cassandra 适配器插入 1,000 行:
for (var i = 0; i < 1000; i++)
{
var id = Guid.NewGuid();
var now = DateTime.Now;
var insertNotif = session.Prepare(@"
INSERT INTO notifications
(id,customer,region,location,operator,till,receipt_id,value,details,is_refund,has_promos,raised,recorded,utc_offset,frame_count,expecting_video)
VALUES (?,?,?,?,?,?,?,?,?,?,?,now(),now(),?,?,?)");
var insertNotifStatement = insertNotif.Bind(id, "cust1", "reg1", "loc1", "tomm", "london", i.ToString(), i % 10.99D, "DATA_HERE", false, true, (int)TimeZone.CurrentTimeZone.GetUtcOffset(now).TotalMinutes, 0, false);
session.Execute(insertNotifStatement);
Thread.Sleep(10);
}
我期望发生的是所有记录都将根据raised 列按时间降序存储。当我使用 CQLSH 检查数据时,它似乎是随机顺序的:
cqlsh:my_keyspace> select dateOf(raised) from notifications limit 5;
dateOf(raised)
--------------------------------------
2014-06-03 11:12:45GMT Daylight Time
2014-06-03 11:12:48GMT Daylight Time
2014-06-03 11:12:56GMT Daylight Time
2014-06-03 11:12:32GMT Daylight Time
2014-06-03 11:12:34GMT Daylight Time
(5 rows)
我做错了吗?
顺便说一句,我还尝试将 raised 设置为时间戳列并期望相同的行为(但我从 .NET 而不是 now() 传入 DateTimes),但它的行为方式完全相同。
如何按时间降序存储和检索我的记录?
【问题讨论】:
-
order by 仅在分区键受 eq 或 in.. 限制时才支持。
-
我没有使用 ORDER BY,由于架构中定义的聚类顺序,我希望记录按日期降序存储。通过查询数据,我期望数据按照聚类顺序定义的顺序返回。
标签: database cassandra cql cql3 cqlsh