Aerospike secondery指数在地图上

时间:2018-01-27 22:37:40

标签: nosql aerospike

我对Aerospike DB和二级索引有疑问。

我有一组学生,每个学生(记录密钥是StudentId), 有一个地图(bin),由<CourseId ,Grade>组成。

我想只选择参加特定课程的学生。 我该怎么做 ? 我应该在地图上添加二次索引吗?使用UDF?

感谢。

1 个答案:

答案 0 :(得分:3)

您可以使用两种方法 - 一种使用二级索引,一种不使用(只使用主索引进行键值操作)。

没有辅助索引

让我们假设你的应用程序有三种类型,每种类型都在Aerospike中设置 - coursesstudentsroster。课程对象包含有关课程的信息,学生对象保存有关学生的信息。 roster对象具有与课程相同的键,或者可能是复合 courseID | semester 。该课程应该有一个bin 学生,其中包含学生ID列表。要获得课程的学生,您将获得roster记录,然后将其学生键列表转换为针对students的单个批量阅读操作。

当然你也可以折叠它,只有两套 - coursesstudents,并将课程学生列表保留为课程对象中的bin。这里不需要多对一加入,因为您可以使用listmap复杂data types

如果您想在没有辅助索引的情况下执行更复杂的查询,可以将predicate filter应用于courses集的扫描(请参阅使用Java客户端的example方式)。

使用辅助索引

您可以在学生对象中添加bin in ,其值为课程ID列表(这意味着您可以轻松地从ID中获取课程对象)。您可以构建secondary index over that list课程ID。要获得学生的课程,您可以通过其键获取学生对象,并查看课程中 bin。要让所有学生参加特定课程,请在students集合中的记录区域上运行二级索引查询。

您可以对此辅助索引查询找到的记录应用谓词过滤器,以便按其他条件进一步过滤学生。