我将嵌套的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对象的多个字段类似。有什么解决方法可以避免空插入
答案 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版本中都不存在。