Nosql 地图上的Aerospike二级索引

Nosql 地图上的Aerospike二级索引,nosql,aerospike,Nosql,Aerospike,我有一个关于Aerospike DB和二次索引的问题 我有一组学生,每个学生(记录键是StudentId), 有一个由组成的映射(bin) 我只想选择参加特定课程的学生。 我怎么做? 我应该在地图上添加第二索引吗?使用UDF 谢谢 您可以使用两种方法—一种是使用辅助索引,另一种是不使用辅助索引(仅使用主索引进行键值操作) 无二级索引 让我们假设您的应用程序中有三种类型,每种类型在Aerospike-课程,学生,花名册中都有自己的设置。课程对象保存关于课程的信息,学生对象保存关于学生的信息。 花名

我有一个关于Aerospike DB和二次索引的问题

我有一组学生,每个学生(记录键是StudentId), 有一个由
组成的映射(bin)

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


谢谢

您可以使用两种方法—一种是使用辅助索引,另一种是不使用辅助索引(仅使用主索引进行键值操作)

无二级索引

让我们假设您的应用程序中有三种类型,每种类型在Aerospike-
课程
学生
花名册
中都有自己的设置。课程对象保存关于课程的信息,学生对象保存关于学生的信息。
花名册
对象的键与课程相同,或者可能是一个复合课程ID |学期。课程应该有一个bin学生,其中包含学生ID列表。要获取课程的学生,您需要获取
花名册
记录,然后将其学生密钥列表转换为针对
学生
的单批读取操作

当然,您也可以将其折叠,只需拥有两个集合-
课程
学生
,并将课程学生列表作为bin保存在课程对象中。这里不需要多对一的连接,因为您需要处理复杂的问题

如果您想在没有辅助索引的情况下执行更复杂的查询,可以在
课程集的扫描上应用a(参见以这种方式使用Java客户机的示例)

带有二级索引

您可以将课程中的bin添加到student对象,其值为课程ID列表(这意味着您可以轻松地从ID获取课程对象)。当然,您可以构建一个ID。要获取学生的课程,您可以通过其键获取学生对象,并查看课程内存储箱。要获取特定课程中的所有学生,请在
students
集合中的记录箱上运行二级索引查询


您可以将谓词筛选器应用于此二级索引查询找到的记录,以根据其他条件进一步筛选学生。

“,包括。”-包括什么?嗨,Ronen,感谢您的详细评论。PredExp可以很好地处理我描述的场景。我有另一个场景,在课程地图上有一个查询。但是现在我想用contains代替equals来表示特定的CourseId。我的意思是,只选择他们的课程ID存在于课程列表中的课程。我在PredExp中没有找到相关的方法。PredExp可以吗?谢谢我还看到了一个将MAPKEYS与过滤器一起使用的选项。但它也不支持我的方案。具有“列表包含”、“映射键包含”和“映射值包含”操作。Java客户端的API托管在这里:您是指mapKeyIterateOr/MapValiterator吗?是的,这就是我的意思。List、mapKeys、mapValues具有和/或迭代器,用于拾取其中包含特定元素(courseID)的记录。