如何正确更新Cassandra中类型为map<boolean, int>的列?
解决Cassandra Node.js驱动更新布尔键Map列的问题
问题根源
JavaScript对象的键会被强制转换为字符串,当你传入{"false":1, "true":2}或{false:1, true:2}时,键最终都是字符串类型。Cassandra驱动处理时,仅能将字符串"true"解析为布尔类型true,但字符串"false"无法匹配布尔类型的键false,导致该键值对被丢弃,最终只保留true:2。
正确解决方案
使用ES6 Map结构传递参数,因为Map支持非字符串类型的键,Cassandra Node.js驱动会正确识别其中的布尔键并映射到Cassandra的MAP<boolean, int>类型。
代码示例
- 构建包含布尔键的Map:
const mapData = new Map(); mapData.set(false, 1); mapData.set(true, 2);
- 执行更新语句:
client.execute( "UPDATE my_table SET map_bool_int_col = ? WHERE id = ?", [mapData, 1], { prepare: true } );
可选:增量更新单个键值对
如果只需要更新Map中的某个键值对,可以使用Cassandra的Map索引语法:
// 新增或更新false对应的value client.execute( "UPDATE my_table SET map_bool_int_col[?] = ? WHERE id = ?", [false, 1, 1], { prepare: true } );
验证结果
执行查询语句获取数据时,会得到完整的Map值:
client.execute("SELECT map_bool_int_col FROM my_table WHERE id = ?", [1], { prepare: true }) .then(result => { console.log(result.rows[0].map_bool_int_col); // 输出: Map(2) { false => 1, true => 2 } });
内容的提问来源于stack exchange,提问作者Liberator
相关产品推荐
相关产品推荐

