【发布时间】:2013-11-19 19:46:50
【问题描述】:
cassandra:你能查询一个集合字段吗?
假设您想在这样的字段中保留朋友列表,您可以按照以下方式运行查询:where user_id = xxx and friend = 'bob'?
如果一个集合不适合这个,在 cassandra 中跟踪朋友的正确方法是什么?
【问题讨论】:
cassandra:你能查询一个集合字段吗?
假设您想在这样的字段中保留朋友列表,您可以按照以下方式运行查询:where user_id = xxx and friend = 'bob'?
如果一个集合不适合这个,在 cassandra 中跟踪朋友的正确方法是什么?
【问题讨论】:
仍然不支持二级索引,但正在开发中 (CASSANDRA-4511)
在您的模型中,如果您知道 user_id,您可以获取用户并检查“bob”是否在应用程序端的好友列表中。如果您需要查询 person_A 是否是 person_B 的朋友,您可以将集合提取到自己的表中,但此模型需要执行 2 次查询。
CREATE TABLE friends (
user_id text,
friend text,
PRIMARY KEY(user_id, friend)
);
CREATE INDEX idx_friends on friends (friend);
假设你有上表的结果,例如:
user_id | friend
---------+--------
daniel | bob
daniel | jack
jack | bob
如果你想找到所有关注鲍勃的人,你可以使用SELECT * FROM friends WHERE friend='bob'。实际上,您也可以在没有二级索引并使用 ALLOW FILTERING 的情况下这样做,但这可能会导致不可预测的性能:
ALLOW FILTERING 选项允许显式允许(某些)需要过滤的查询。请注意,使用 ALLOW FILTERING 的查询因此可能具有不可预测的性能(对于上述定义),即即使选择少量记录的查询也可能表现出取决于集群中存储的数据总量的性能。
【讨论】: