为cassandra

时间:2018-09-24 08:43:29

标签: cassandra

我将嵌套的JSON值存储在Cassandra中,因为我有很多字段,有没有办法为未传入的字段保留未设置的值

考虑到我有一个如下表,

CREATE TYPE address (number int, street text, address2 text);

CREATE TABLE users (
    id int PRIMARY KEY,
            street_address frozen<address>
);

INSERT INTO users JSON '{"id": 5, "street_address": 
   {"number": 123, "street": "Main St."}}';

如果我在下面运行以上查询,则为列值,

5   {number:123,street:'Main St.',address2:NULL}

我想忽略第二列中的address2:NULL插入。我也尝试过“默认未设置”,但是它不起作用

我仅使用此表中的2个字段来构成框架,与我具有嵌套JSON对象的多个字段类似。有什么解决方法可以避免空插入

1 个答案:

答案 0 :(得分:0)

更新问题后回答:

您在此处使用frozen UDT,并且它立即更新(as one binary object),因此,如果数据中缺少该字段,则将其表示为null。但是,如果您使用的是非冻结UDT,则DEFAULT UNSET可以按要求工作-缺少的字段不会覆盖现有值:

cqlsh:test> INSERT INTO users2 JSON '{"id": 5, "street_address": {"number": 123, 
    "street": "Main St.", "address2": "test" }}';
cqlsh:test> SELECT * from users2;

 id | street_address
----+-----------------------------------------------------
  5 | {number: 123, street: 'Main St.', address2: 'test'}

(1 rows)
cqlsh:test> INSERT INTO users JSON '{"id": 5, "street_address": {"number": 1234, 
    "street": "Main St.3"}}' DEFAULT UNSET ;
cqlsh:test> SELECT * from users2;

 id | street_address
----+-----------------------------------------------------
  5 | {number: 123, street: 'Main St.', address2: 'test'}

(1 rows)

答案的第一个变体:

默认情况下,在插入JSON时指定了DEFAULT NULL选项-这意味着所有丢失的字段都被null替换,因此它们可以删除现有数据。如果要取消设置它们,则需要在JSON值后指定相应的选项,如下所示:

INSERT INTO mytable JSON '{ "\"myKey\"": 0, "value": 0}' DEFAULT UNSET;

有关此主题的说明,请参见Cassandra documentation

P.S。如果我没记错的话,这个选项可能在每个Cassandra版本中都不存在。