Nosql Aerospike-地图键查询

Nosql Aerospike-地图键查询,nosql,user-defined-functions,aerospike,Nosql,User Defined Functions,Aerospike,我有一个关于Aerospike DB的问题 我有一组学生,每个学生(记录键是StudentId)都有一个的地图(bin)。 我正在尝试创建一些查询,但我不确定正确的方法是什么 我有一个包含课程ID列表的变量 我要创建的查询包括: 对于每个学生,获取地图和列表中存在的所有课程ID 对于每个学生,获取仅存在于其地图中而不存在于列表中的所有课程ID 这里最好的方法是什么?我应该使用UDF吗 谢谢。这是一种很好的扩展功能的方式,而这种功能在中还不存在。记录UDF可以将bin名称作为第一个参数,将您的列表

我有一个关于Aerospike DB的问题

我有一组学生,每个学生(记录键是StudentId)都有一个
的地图(bin)。 我正在尝试创建一些查询,但我不确定正确的方法是什么

我有一个包含
课程ID列表的变量

我要创建的查询包括:

  • 对于每个学生,获取地图和列表中存在的所有课程ID
  • 对于每个学生,获取仅存在于其地图中而不存在于列表中的所有课程ID
  • 这里最好的方法是什么?我应该使用UDF吗


    谢谢。

    这是一种很好的扩展功能的方式,而这种功能在中还不存在。记录UDF可以将bin名称作为第一个参数,将您的列表变量作为第二个参数,并使用可选的第三个参数来确定这是“IN”还是“NOT IN”,然后根据球场ID的地图对其进行迭代

    您可以将此记录UDF应用于通过针对包含学生的集合运行的扫描或查询匹配的每个记录

    测试。lua

    function list_compare(rec, bin, l, not_in_l)
      if rec[bin] then
        local b = rec[bin]
        if (tostring(getmetatable(rec[bin])) == tostring(getmetatable(list()))) then
          iter = list.iterator
        elseif (tostring(getmetatable(rec[bin])) == tostring(getmetatable(map()))) then
          iter = map.values
        else
          return nil
        end
        local s = {}
        local l_keys = {}
        if (not_in_l ~= nil) then
          for v in list.iterator(l) do
            l_keys[v] = 1
          end
        end
        for i in list.iterator(l) do
          for v in iter(b) do
            if (not_in_l == nil) then
              if (i == v) then
                s[v] = 1
              end
            else
              if (i ~= v and not l_keys[v]) then
                s[v] = 1
              end
            end
          end
        end
        local keys = {}
        for k,v in pairs(s) do
          table.insert(keys, k)
        end
        table.sort(keys)
        return list(keys)
      end
    end
    
    在AQL中:

    $ aql
    Aerospike Query Client
    Version 3.15.1.2
    C Client Version 4.3.0
    Copyright 2012-2017 Aerospike. All rights reserved.
    aql> register module './test.lua'
    OK, 1 module added.
    aql> insert into test.demo (PK,i,s,m,l) values ('88',6,'six',MAP('{"a":2, "b":4, "c":8, "d":16}'),LIST('[2, 4, 8, 16, 32, 128, 256]'))
    OK, 1 record affected.
    
    aql> select * from test.demo where PK='88'
    +---+-------+--------------------------------------+-------------------------------------+
    | i | s     | m                                    | l                                   |
    +---+-------+--------------------------------------+-------------------------------------+
    | 6 | "six" | MAP('{"a":2, "b":4, "c":8, "d":16}') | LIST('[2, 4, 8, 16, 32, 128, 256]') |
    +---+-------+--------------------------------------+-------------------------------------+
    1 row in set (0.001 secs)
    
    aql> execute test.list_compare("l", LIST('[1,2,3,4]')) on test.demo where PK='88'
    +----------------+
    | list_compare   |
    +----------------+
    | LIST('[2, 4]') |
    +----------------+
    1 row in set (0.002 secs)
    
    aql> execute test.list_compare("l", LIST('[1,2,3,4]'),1) on test.demo where PK='88'
    +-------------------------------+
    | list_compare                  |
    +-------------------------------+
    | LIST('[8, 16, 32, 128, 256]') |
    +-------------------------------+
    1 row in set (0.001 secs)
    
    aql> execute test.list_compare("m", LIST('[1,2,3,4]')) on test.demo where PK='88'
    +----------------+
    | list_compare   |
    +----------------+
    | LIST('[2, 4]') |
    +----------------+
    1 row in set (0.001 secs)
    
    aql> execute test.list_compare("m", LIST('[1,2,3,4]'), 1) on test.demo where PK='88'
    +-----------------+
    | list_compare    |
    +-----------------+
    | LIST('[8, 16]') |
    +-----------------+
    1 row in set (0.000 secs)
    

    顺便说一句,由于尖括号所以没有显示地图结构。我只是在它周围加了一个`字。你可以通过在Github中打开一个关于回购的问题来要求将这种类型的功能添加到PredExp中。谢谢Ronen。我试试看。