2014-11-06 57 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

您所得到的结果是预期的,因为您已将朋友和敌人作为主键的一部分。英雄与朋友和敌人有着一对多的关系。在我所指的我的博客文章中,我只使用主要实体属性作为主键。所有子实体属性都映射为动态列。