使用Cassandra存储嵌套的JSON

时间:2014-11-06 16:52:41

标签: json node.js cassandra

我正在尝试使用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处理复合物品的方式?

1 个答案:

答案 0 :(得分:0)

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