Ответ после обновленного вопроса:
Вы используете frozen
UDT здесь, и он обновляется сразу ( как один двоичный объект ), поэтому, если поле отсутствует вданные, то это представляется как 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 для получения разъяснений по этой теме.
PS Если я правильно помню, эта опция может существовать не в каждой версии Cassandra.