我试图在Cassandra和nodejs绑定中使用复合表来存储嵌套的JSON对象。用Cassandra存储嵌套的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处理复合材料的方式吗?
在CQL和存储引擎中如何表示列和行是有区别的。 您应该关注构成CQL PRIMARY KEY的内容:分区密钥和集群密钥。有关更多信息,请参见[Cassandra专家的CQL3](http://www.datastax.com/dev/blog/cql3-for-cassandra-experts)。 – jorgebg 2014-11-07 09:16:10