我試圖在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