Database 数据库中有两个数字的多重和复合二级索引

Database 数据库中有两个数字的多重和复合二级索引,database,rethinkdb,nosql,Database,Rethinkdb,Nosql,我在下面名为numbers的空DB表中有文档,其中包含嵌套对象。我在内部对象内的一对数字上创建了一个二级索引,一个复合索引和一个多索引。复合是因为我想使用2元素数组作为二级索引,而multi是因为相同的2元素对可能对应多个文档 在这里,我创建了该二级索引,并在Data Explorer浏览器视图中插入了一些文档: r.db('test')) .table('数字') .indexCreate('idx',[r.row('group')('a'),r.row('group')('b')]), {m

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

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

r.db('test'))
.table('数字')
.indexCreate('idx',[r.row('group')('a'),r.row('group')('b')]),
{multi:true});
r、 db('test')。表('numbers')。插入([
{名称:'Foo',组:{a:2,b:3},
{名称:'Bar',组:{a:2,b:9},
{name:'Baz',组:{a:2,b:3},
{name:'Qwer',组:{a:4,b:4}
]);
现在,我使用
之间运行查询。对于本例,我希望看到返回三个文档,但没有返回任何文档:

r.db('test')。表('numbers')。介于([2,0],[3,5],{index:'idx'})之间;
//没有返回结果。
困惑的是,我只使用标量查找测试了这个二级索引(因此假装
idx
不是复合索引):它返回文档

r.db('test')。表('numbers')。介于(2,3,{index:'idx'})之间
//返回3行:Foo、Bar、Baz
什么?为什么要将
idx
次要数组视为标量索引(而不是数组)并返回三个文档?我的复合索引怎么了

rightbund
设置为
closed
似乎没有任何作用。此外,使用函数构建索引键,即将
函数(obj){return[obj('group')('a')、obj('group')('b'));}
传递到
indexCreate
不会产生差异


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

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

理解多索引 多,因为同一2对可能对应多个文档

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

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

{
    "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').between([ 2, 0 ], [ 3, 5 ], {index : 'idx'});
返回:

{
  "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"
}

我认为这里的主要问题是你不需要一个多索引

理解多索引 多,因为同一2对可能对应多个文档

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

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

{
    "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').between([ 2, 0 ], [ 3, 5 ], {index : 'idx'});
返回:

{
  "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"
}

天哪,我真不敢相信我忘记了多索引的用途,它们是为了允许同一个文档被多个键索引,而不是为了同一个键索引多个文档。很抱歉让你输入这么详细的答案!非常感谢,不用担心。如果这让你有点困惑的话,那么无论是谁,在几天内谷歌都可能会对此感到困惑!天哪,我真不敢相信我忘记了多索引的用途,它们是为了允许同一个文档被多个键索引,而不是为了同一个键索引多个文档。很抱歉让你输入这么详细的答案!非常感谢,不用担心。如果这让你有点困惑的话,那么无论是谁,在几天内谷歌都可能会对此感到困惑!