Cassandra Map(和Set)类型不保留顺序是正确的。
aploetz@cqlsh:stackoverflow2> CREATE TABLE maptest
(key text PRIMARY KEY, values map<text,text>);
aploetz@cqlsh:stackoverflow2> INSERT INTO maptest (key, values)
VALUES ('key1',{'4':'Four','1':'One','2':'Two'});
aploetz@cqlsh:stackoverflow2> SELECT * FROM maptest ;
key | values
------+---------------------------------------
key1 | {'1': 'One', '2': 'Two', '4': 'Four'}
(1 rows)
但是 List 类型可以很好地处理这个问题:
aploetz@cqlsh:stackoverflow2> CREATE TABLE listtest
(key text PRIMARY KEY, values list<text>);
aploetz@cqlsh:stackoverflow2> INSERT INTO listtest (key, values)
VALUES ('key2',['4','1','2']);
aploetz@cqlsh:stackoverflow2> SELECT * FROM listtest ;
key | values
------+-----------------
key2 | ['4', '1', '2']
(1 rows)
也许(作为一种解决方法)您可以尝试在 Map 中包含 List 类型的列。您可以按照您选择的顺序将密钥存储在列表中。当您读回您的行时,您可以遍历列表(按照您选择的顺序),并使用列表值来确定要从 Map 中提取哪些键/值对。