Cassandra条件更新到集合

时间:2017-09-07 00:50:47

标签: collections cassandra cql cqlsh

我有一个表是一个简单的键值存储,其中键是uuid,value是UDT(用户定义类型)的映射。

示例行为JSON:

{
  "id" = "123-123-12321",
  "map" = {
    "object1": {
      "value": "1",
      "timestamp": "2016-11-22 09:37:39.197000+0000"
    },
    "object2": {
      "value": "2",
      "timestamp": "2016-11-22 09:37:39.197000+0000"
    }
  }
}

我想仅在给定的更新对象具有更高的时间戳时才对地图中的一个对象执行更新,例如:

"object2": {
      "value": "3",
      "timestamp": "2011-10-11 23:13:42.321000+0000"
}

会覆盖地图中的“object2”键,因为它带有更晚的时间戳。

如何撰写此类更新?

1 个答案:

答案 0 :(得分:0)

  

每次写入(插入/更新/删除)到cassandra,也会插入与每列关联的时间戳。当您执行读取查询时,时间戳用于选择"获胜"在单个列或集合元素中更新

Cassandra允许用户使用USING TIMESTAMP epoch_in_microseconds显式设置该时间戳以及插入/更新/删除语句,该语句将用于选择"获胜"更新

那我们怎么能用呢?

每次插入/更新时间戳值转换为epoch_in_microseconds并将其与USING TIMESTAMP converted_value一起使用。

示例:

INSERT INTO data(id, map) VALUES('123-123-12321', {'object2' : {value : '2', timestamp : '2017-09-09 16:24:06.197000+0000'}}) USING TIMESTAMP 1504952646912000;

此处15049526469120002017-09-09 16:24:06.197000+0000

的转换值

UPDATE data SET map['object2'] = {value : '3', timestamp : '2017-09-09 16:08:42.197000+0000'} WHERE id = '123-123-12321' USING TIMESTAMP 1504951722676000;

最后,您的输出将是键object2

的值2