使用Cassandra存储嵌套JSON
我试图在Cassandra和nodejs绑定中使用复合表存储嵌套的JSON对象 假设我的数据是这样的(朋友和敌人的数据结构实际上比简单的地图更复杂): 根据我对复合键(此处:)的理解,我希望将数据存储如下:使用Cassandra存储嵌套JSON,json,node.js,cassandra,Json,Node.js,Cassandra,我试图在Cassandra和nodejs绑定中使用复合表存储嵌套的JSON对象 假设我的数据是这样的(朋友和敌人的数据结构实际上比简单的地图更复杂): 根据我对复合键(此处:)的理解,我希望将数据存储如下: 001 | luke | skywalker | friend:002:han:solo | friend:003:obiwan:kenobi | ... | foe:006:boba:feet CREATE TABLE heroes ( id int, n
001 | luke | skywalker | friend:002:han:solo | friend:003:obiwan:kenobi | ... | foe:006:boba:feet
CREATE TABLE heroes (
id int,
name text,
lastname text,
friend_id int,
friend_name text,
friend_lastname text,
foe_id int,
foe_name text,
foe_lastname text,
PRIMARY KEY ((id, name, lastname), friend_id, foe_id)
);
{ rows:
[ { __columns: [Object],
id: 001,
name: 'luke',
lastname: 'skywalker',
friend_id: 002,
friend_name: 'han',
friend_lastname: 'solo',
foe_id: null,
foe_name: null,
foe_lastname: null } ],
meta:
// some data
}
我创建的表格如下所示:
001 | luke | skywalker | friend:002:han:solo | friend:003:obiwan:kenobi | ... | foe:006:boba:feet
CREATE TABLE heroes (
id int,
name text,
lastname text,
friend_id int,
friend_name text,
friend_lastname text,
foe_id int,
foe_name text,
foe_lastname text,
PRIMARY KEY ((id, name, lastname), friend_id, foe_id)
);
{ rows:
[ { __columns: [Object],
id: 001,
name: 'luke',
lastname: 'skywalker',
friend_id: 002,
friend_name: 'han',
friend_lastname: 'solo',
foe_id: null,
foe_name: null,
foe_lastname: null } ],
meta:
// some data
}
然后为每个朋友或敌人跑步:
client.execute(
'INSERT INTO heros (id, name, lastname, friend_id, friend_name, friend_lastname) VALUES (?, ?, ?, ?, ?)',
[001, 'luke', skywalker', 002, 'han', 'solo'],
function(err) {
//some code
}
)
现在,当运行查询时,'SELECT*FROM heromes WHERE id=001'
我希望只得到一行,所有的朋友或敌人都添加为列。
相反,我在那里和朋友和敌人一样吵架。除此之外,朋友的一行如下所示:
001 | luke | skywalker | friend:002:han:solo | friend:003:obiwan:kenobi | ... | foe:006:boba:feet
CREATE TABLE heroes (
id int,
name text,
lastname text,
friend_id int,
friend_name text,
friend_lastname text,
foe_id int,
foe_name text,
foe_lastname text,
PRIMARY KEY ((id, name, lastname), friend_id, foe_id)
);
{ rows:
[ { __columns: [Object],
id: 001,
name: 'luke',
lastname: 'skywalker',
friend_id: 002,
friend_name: 'han',
friend_lastname: 'solo',
foe_id: null,
foe_name: null,
foe_lastname: null } ],
meta:
// some data
}
我本以为它根本就不会有敌人
是我做错了什么,还是卡桑德拉处理复合物品的方式?你得到的结果是意料之中的,因为你在主键中包含了朋友和敌人。英雄与朋友和敌人有一对多的联系。在您提到的我的博客文章中,我只使用了primary实体属性作为主键。所有子实体属性都映射为动态列。列和行在CQL和存储引擎中的表达方式有所不同。您应该关注CQL主键的组成:分区键和集群键。有关更多信息,请参阅。