当前位置: 首页 > 知识库问答 >
问题:

通过使用不同迭代器的复合索引从Tarantool中选择

钦永贞
2023-03-14

我有太空人:

  1. id
  2. 姓名
  3. 年龄

有两个索引:

peoples = box.schema.space.create('peoples', {engine = 'memtx', field_count = 3, if_not_exists = true})
peoples:create_index('primary', {type = 'TREE', unique = true, parts = {1, 'unsigned'}, if_not_exists = true})
peoples:create_index('by_name_age', {type = 'TREE', unique = false, parts = {2, 'STR', 3, 'unsigned'}, if_not_exists = true})

和数据:

peoples:auto_increment{ 'name_1', 10 }
peoples:auto_increment{ 'name_1', 11 }
peoples:auto_increment{ 'name_1', 12 }

我需要按姓名和年龄选择的人,而不是一些价值。例如,我想选择所有有年龄的“亚历克斯”

[1, 'Alex', 11]
[2, 'Alex', 12]

我尝试执行查询:

peoples.index.by_name_age:select({'Alex', 10}, {{iterator = box.index.EQ},{iterator = box.index.GT}})

但是得到结果

[1, 'Alex', 10]

如何对名称和年龄索引部分使用不同的迭代器?

共有2个答案

衡玄裳
2023-03-14
peoples.index.by_name_age:pairs({'Alex', 10}, 'GE'):
    take_while(function(x) return x.name == 'Alex' end):
    totable()

在这里,它开始迭代所有具有名称的记录

: totable()是可选的,如果没有它,这个表达式可以在类似于的for循环中使用。

邵刚洁
2023-03-14

您有一个索引,它按第一部分排序。意味着它无法按照您的期望进行选择。

你必须做什么才能看到预期的行为?您必须在GE迭代器中使用for循环[1],并且必须使用此循环中的if条件测试范围。

[1] 一个简单的代码示例:

local test_val = 'Alex'
for _, v in peoples.index.by_name_age:select({test_val, 10}, {iterator = box.index.GE})
   if v[1] ~= test_val then
   -- do exit
   end
   -- do store result 
end
 类似资料:
  • 我有两个表:user,user\u匹配。我想在一个查询中从两个表中获取项。例如,类似SQL的查询: 通常我应该在NoSQL数据库中使用2查询。现在我这样做: 从user_matchinguser_id 与user_id从用户获取 我可以用Tarantool的一个查询来替换它吗。那怎么做呢?

  • 我有一些空间顶部与字段: -id, -状态, -评级 我对space top有两个索引: 我可以按id或状态进行选择 有时我需要按状态选择,按等级排序。 什么是最好的方法?创建另一个索引与零件状态,评级,并使一些棘手的查询,如果可能的话?或者继续按状态选择,并在Lua过程中按等级进行排序?谢谢! UPD:谢谢,克斯特亚!我这样修改索引状态: 现在我可以问: 伟大的

  • 问题内容: 我试图根据当前正在另一个列表上迭代的索引显示来自其他列表的值,但无法弄清楚如何访问各个项目。 如你所见,我尝试使用它,但是它什么也不显示,它只是创建一个空的表头元素。 我的其他数组在视图中的定义如下,如果删除,则可以看到整个数组已打印到表头 如果我错过任何必填信息,请告诉我。 问题答案: 听起来你想同时遍历两个列表,换句话说就是zip()列表。 如果是这种情况,最好在视图中进行操作并在

  • 我在MongoDB有一个收藏,里面有以下文档。 现在,我尝试使用以下查询查询一些文档。 根据我的理解,由于\u id是一个复合字段,并且Mongo总是在\u id上维护一个索引,因此要回答上述查询,Mongo应该在“\u id”上使用索引。然而,上述问题的答案如下: 可以观察到,MongoDB正在对DB进行一次完整的扫描,以查找少量文档。我不知道这里到底怎么了。 我试图改变查询的顺序,但结果相同。

  • 我有一个Firebase数据库,在一个特定的节点级别上有日期,每个日期都有键值对,其值为一定的数字。现在我需要找到最近两天常见的数字。

  • 我有一个优惠券服务,它根据id给我优惠券,退货类型是Mono。此外,我还有另一项服务,可以列出一个具有返回类型Flux的组织的所有员工。 我想创建一个反应式函数来返回给定优惠券id的流量。如果为,则返回空流量,如果则从优惠券对象返回员工id集,否则,如果是,则调用外部服务并从流量中返回“id”。 这是一个参考对象。 下面是方法签名。