【问题标题】:Aerospike secondery index on map地图上的 Aerospike 二级索引
【发布时间】:2018-01-27 22:37:40
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • ",包含 ." - 由什么组成?

标签: nosql aerospike


【解决方案1】:

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

没有二级索引

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

当然,您也可以将其折叠并只设置两组 - coursesstudents,并将课程学生列表作为课程对象中的 bin。此处无需多对一连接,因为您可以使用 listmap 复合体 data types

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

带有二级索引

您可以向学生对象添加一个 binin-course,其值为课程 ID 列表(这意味着您可以轻松地从 ID 中获取课程对象)。你可以建立一个secondary index over that list当然的ID。要获取学生的课程,您可以通过键获取学生对象,然后查看 in-course 箱。要获取特定课程的所有学生,请对 students 集中的记录箱运行二级索引查询。

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

【讨论】:

  • 您好 Ronen,感谢您的详细评论。 PredExp 适用于我描述的场景。我有另一种情况,在课程地图上进行查询。但现在我想对特定的 CourseId 使用包含而不是等于。我的意思是,只选择其 courseId 存在于 ListOfCourses 中的课程。我在 PredExp 中没有找到相关的方法。 PredExp 可以吗?谢谢!
  • 我还看到了一个使用带有过滤器的 MAPKEYS 的选项。但它也不支持我的方案。
  • PredExp 具有“列表包含”、“映射键包含”和“映射值包含”操作。 Java 客户端的 API 托管在这里:aerospike.com/apidocs/java
  • 你的意思是 mapKeyIterateOr / mapValIterateOr 吗?
  • 是的,我就是这个意思。 List、mapKeys、mapValues 具有和/或迭代器,用于挑选其中包含特定元素 (courseID) 的记录。
猜你喜欢
  • 2018-03-23
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多