2014-11-06 54 views
0

我試圖在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處理複合材料的方式嗎?

+0

在CQL和存儲引擎中如何表示列和行是有區別的。 您應該關注構成CQL PRIMARY KEY的內容:分區密鑰和集羣密鑰。有關更多信息,請參見[Cassandra專家的CQL3](http://www.datastax.com/dev/blog/cql3-for-cassandra-experts)。 – jorgebg 2014-11-07 09:16:10

回答

0

您所得到的結果是預期的,因爲您已將朋友和敵人作爲主鍵的一部分。英雄與朋友和敵人有着一對多的關係。在我所指的我的博客文章中,我只使用主要實體屬性作爲主鍵。所有子實體屬性都映射爲動態列。