当前位置: 首页 > 知识库问答 >
问题:

使用Cassandra存储嵌套JSON

邹星火
2023-03-14

我正在尝试使用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' }
  ]
}

根据我对复合键的理解(这里:html" target="_blank">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*FROMHEROHSWHEREID=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
}

我本以为它根本就没有敌人的战场。

是我做错了什么,还是卡珊德拉处理复合物品的方式有问题?

共有1个答案

司空学智
2023-03-14

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

 类似资料:
  • 问题内容: 我正在尝试从高度嵌套的go结构构建mongo文档,并且从go struct过渡到mongo对象遇到了问题。我已经在这里构建了一个 非常 简化的版本:http : //play.golang.org/p/yPZW88deOa 运行此命令将产生以下输出: 完全有道理。似乎Write函数或json.Marshal函数都具有折叠嵌套结构的某些功能,但是当我尝试使用mgo函数将此数据插入到mon

  • 问题内容: 是否可以在另一个存储过程中使用一个存储过程的结果? IE 我尝试使用,但无法在嵌套语句中调用。 有什么办法可以做到这一点?环境是SQL Server 2008。 问题答案: 您最多可以嵌套32个级别的存储过程。 我建议阅读这篇有关INSERT- EXEC的文章。这是一个摘录: 如果some_sp尝试使用INSERT-EXEC调用some_other_sp,您将收到一条错误消息。因此,一

  • 我想尝试使用Cassandra作为事件源应用程序中的事件存储。我对事件存储的要求非常简单。事件“模式”应该是这样的: id:聚合根实体的id data:序列化的事件数据(例如JSON) 时间戳:事件发生时 sequence_number:事件的独特版本 我对卡桑德拉完全陌生,所以请原谅我对即将写的东西的无知。我只有两个查询,我想对此数据运行。 为我提供给定聚合根 ID 的所有事件 如果序列号为 我

  • 问题内容: 由于我是Redis的新手,因此我需要一些有关如何在REDIS中存储以下复杂json的指导,以便我们可以从REDIS中访问JSON的元素- 我需要以一种查询IP /主机名/ InstanceID的方式来存储它,以获取JSON中存在的所有元素。 我需要上述指导。 问题答案: 您无法直接做到这一点,但是幸运的是,有一个名为ReJSON的新Redis模块可以完全满足您的需求,并且它还具有不错的

  • 这很可能是我们自己的缺陷(可能是我们的bean配置Kafkapublisher/EventProcessorConfigurer),我们将解决这个问题,但在您看来,更大的问题是,是否可以让Cassandra与Axon一起工作。我记得在google groups论坛上看到一些帖子说,由于性能问题,没有考虑对Cassandra的支持。我们希望确保我们不会投资于那些将是一场噩梦或根本不是一个好的解决方案

  • 我被困在将嵌套JS与宇宙数据库核心SQL API集成上。我知道有一个用于 Cosmos DB 的模块(https://github.com/nestjs/azure-database),但我需要数据架构来支持嵌套的 json,如下所示: 我认为@nestjs/azure-database不支持这一点(或者我可能错了),因为当我检查他们的示例和quickstart时,没有这样的json模式的示例。