我正在尝试使用Cassandra中的复合表和nodejs绑定来存储嵌套的JSON对象。
让我们说我的数据看起来像这样(朋友和敌人实际上拥有比简单地图更复杂的数据结构):
{
id: 001,
name: 'luke',
lastname: 'skywalker',
friends: [
{ id: 002,
name: 'han',
lastname: 'solo' },
{ id: 003,
name: 'obiwan',
lastname: 'kenobi' },
{ id: 004,
name: 'leila',
lastname: 'skywalker' }
],
foes: [
{ id: 005,
name: 'dark',
lastname: 'vador' },
{ id: 006,
name: 'boba',
lastname: 'feet' }
]
}
根据我从复合键(这里:https://pkghosh.wordpress.com/2013/07/14/storing-nested-objects-in-cassandra-composite_columns/)的理解,我希望存储我的数据:
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)
);
然后为每个朋友或敌人竞选:
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 heroes WHERE id=001'
时,我希望只获得一行,并将所有朋友或敌人添加为列。
相反,我得到了与朋友和敌人一样多的排。最重要的是,朋友的一行看起来像这样:
{ 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
}
我原本以为它根本没有foe_ *字段。
我做错了什么或是cassandra处理复合物品的方式?
答案 0 :(得分:0)
您获得的结果是预期的,因为您已将好友和敌人作为主键的一部分。英雄与朋友和敌人有一对多的联系。在我所指的我的博客文章中,我只使用主要实体属性作为主键。所有子实体属性都映射为动态列。