RethinkDB 中具有两个数字的多复合二级索引

Multi and compound secondary index with two numbers in RethinkDB

我在下面名为 numbers 的空 RethinkDB table 中有文档,其中包含嵌套对象。我在内部对象内的一对数字上创建了一个二级索引、一个复合索引和一个多索引。复合是因为我想使用 2 元素数组作为二级索引,而多是因为相同的 2 对可能对应多个文档。

在这里,我创建了二级索引并在 Data Explorer 浏览器视图中插入了一些文档:

r.db('test')
    .table('numbers')
    .indexCreate('idx', [ r.row('group')('a'), r.row('group')('b') ],
                 {multi : true});
r.db('test').table('numbers').insert([
  {name : 'Foo', group : {a : 2, b : 3}},
  {name : 'Bar', group : {a : 2, b : 9}},
  {name : 'Baz', group : {a : 2, b : 3}},
  {name : 'Qwer', group : {a : 4, b : 4}}
]);

现在我使用 between 转到 运行 查询。对于此示例,我希望看到三个文档 returned,但是 我没有返回任何文档:

r.db('test').table('numbers').between([ 2, 0 ], [ 3, 5 ], {index : 'idx'});
//  No results returned.

困惑,我只用标量查找测试了这个二级索引(所以假装 idx 不是复合索引):returns 文档!

r.db('test').table('numbers').between(2, 3, {index : 'idx'})
//  3 rows returned: Foo, Bar, Baz

什么?为什么将 idx 二级数组视为标量索引(而不是数组)和 return 三个文件?我的复合索引发生了什么变化?

rightBound设置为closed似乎没有任何作用。此外,使用函数构建索引键,即将 function(obj) {return [obj('group')('a'), obj('group')('b')];} 传递给 indexCreate 并没有什么不同。

我已经测试了另一个复合多索引,其键是 [string, number, number],并且 between 非常适合这种多情况:它可以找到文档。为什么双数多案例在这里不起作用?

我认为这里的主要问题是您不需要多索引。

了解多索引

multi because the same 2-pair might correspond to multiple documents

对于任何二级索引,该索引假定 属性 的值(在本例中为一对​​值)对应于多个文档。在RethinkDB中,因为它是一个分布式数据库,你只能保证一个值对于主索引是唯一的。

多索引适用于您想要其中一个值的值数组。标签就是一个例子:

{
    "title": "...",
    "content": "...",
    "tags": [ <tag1>, <tag2>, ... ]
}

// Create the multi index based on the field tags
r.table("posts").indexCreate("tags", { multi: true })

// Your query
r.table("posts").getAll(<tag1>, { index: "tags" })

您的查询

正因为如此,您可以只创建相同的复合索引,而不必创建多索引。

r.db('test')
 .table('numbers')
 .indexCreate('idx', [ r.row('group')('a'), r.row('group')('b') ]);

那么您的查询将 return 如预期的那样:

r.db('test').table('numbers').between([ 2, 0 ], [ 3, 5 ], {index : 'idx'});

Returns:

{
  "group": {
    "a": 2 ,
    "b": 3
  } ,
  "id":  "f711dae4-7e91-4864-9977-956221a10a08" ,
  "name":  "Foo"
}, {
  "group": {
    "a": 2 ,
    "b": 3
  } ,
  "id":  "29732f5f-a6e6-45e6-aaaf-fd2c9d1bb3fe" ,
  "name":  "Baz"
}, {
  "group": {
    "a": 2 ,
    "b": 9
  } ,
  "id":  "1881eafb-4349-43c8-9fb2-d453720b09a6" ,
  "name":  "Bar"
}