Cassandra与MongoDB - 如何存储包含未知键的JSON数据?

7

我尝试集成一个NoSQL数据库来存储JSON数据,而不是使用SQL数据库来存储JSON数据(一个存储JSON对象的列)。

对于MongoDB,我可以通过以下方式插入JSON文件:

document = <JSON OBJECT>
collection.insert(document)

然而,根据这个网页(http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-2-json-support),对于Cassandra来说,它不可能是无模式的,也就是说我需要预先创建一个表:
CREATE TABLE users (
    id text PRIMARY KEY,
    age int,
    state text
);

接下来插入数据:

INSERT INTO users JSON '{"id": "user123", "age": 42, "state": "TX"}';

问题在于我想尝试使用Cassandra,刚刚完成了DataStax的教程,但似乎需要预先知道JSON数据的键,这是不可能的。
或者当有新的数据列和未知的键时,我应该修改表吗?那听起来不像一个很好的设计决策。
有人可以指点一下我正确的方向吗?谢谢。

2
我的经验是,你必须事先设计好模式,否则就要后期修改它... - keypoint
2个回答

13

这个JSON支持非常具有误导性 - 它支持Cql中的JSON,而不是存储中的JSON。

或者当有新的数据列和未知键时,我应该修改表格吗?那听起来并不是一个很好的设计决策。

的确,这不是一个好的决策 - 你的JSON字段在实体之间可以有不同的类型 - 一个列名不能涵盖所有情况。此外,添加新的字段需要在集群中进行模式传播,因此第一次插入(包含alter table + insert data)会非常慢。

Cassandra没有为您提供任何内置机制,但您可以将整个JSON放入一个字段中,并在额外的单独列中公开所需的属性。例如:

CREATE TABLE users (
    id text PRIMARY KEY,
    json text, //in json age and state
    age int //explicit duplicated property - if you need e.g. index
);

顺便提一句,据我所知,卡桑德拉以前支持您的情况,但现在更加“强类型化”。


谢谢!很多解决方案都指向blob和text。我不修改json,只是读取它,并且我认为将其存储为文本是可以接受的。 - user1157751
还有一件事 - 检查最大文本长度/列大小。在某些情况下,您的JSON可能会太大。 - piotrwest

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接