gpt4 book ai didi

rethinkdb - 如何在 RethinkDB 中通过对象数组查询多索引

转载 作者:行者123 更新时间:2023-12-04 10:24:39 28 4
gpt4 key购买 nike

我正在处理一个看起来像这样的数据集:

"bitrates": [
{
"format": "mp3" ,
"rate": "128K"
} ,
{
"format": "aac" ,
"rate": "192K"
}
] ,
"details": [ ... ] ,
"id": 1 ,
"name": "For Those About To Rock We Salute You" ,
"price": 1026 ,
"requires_shipping": false ,
"sku": "ALBUM-1"
}

我想在 bitrates 上创建二级索引, 弯曲 {multi:true} .这是我的尝试:
r.db("music").table("catalog").indexCreate("bitrates", {multi: true})

索引构建得很好,但是当我查询它时,没有任何返回 - 这似乎与我在这里阅读的每个示例相反:

http://rethinkdb.com/docs/secondary-indexes/javascript/

我写的查询是这样的:
r.db("music").table("catalog").getAll(["mp3", "128K"], {index : "bitrates"})

没有错误,只有 0 个结果(并且我有 300 个左右的包含此确切数据的文档)。

我正在使用 RethinkDB 2.0 RC1。

最佳答案

为列创建索引时,列中的值按字面用作索引的键。在您的情况下,您的 key bitrates索引将是 bitrates 中的对象文档中的数组。

看起来您想要的是从文档字段中的值派生的索引。为此,您需要定义一个自定义索引函数,将文档缩减为您关心的数据。试验它们的最简单方法是从编写查询开始,一旦您对结果感到满意,就将其转换为 indexCreate()陈述。

这是一个语句,它获取您的示例文档(ID 为 1),并提取 formatrate来自其 bitrate 中所有对象的术语数组,然后将它们合并在一起以创建一组不同的字符串:

r.db('music').table('catalog').get(1).do(function(row) {
return row('bitrates').map(function(bitrate) {
return [bitrate('format'), bitrate('rate')];
}).reduce(function(left, right) {
return left.setUnion(right);
})
})

运行此语句将返回以下内容:
["mp3", "128K", "aac", "192K"]

这看起来不错,所以我们可以使用我们的函数来创建索引。在这种情况下,由于我们期望索引函数返回一组项目,我们还想指定 {multi: true}确保我们可以查询集合中的项目,而不是集合本身:
r.db('music').table('catalog').indexCreate('bitrates', function(row) {
return row('bitrates').map(function(bitrate) {
return [bitrate('format'), bitrate('rate')];
}).reduce(function(left, right) {
return left.setUnion(right);
})
}, {multi: true})

创建后,您可以像这样查询索引:
r.db('music').table('catalog').getAll('mp3', {index: 'bitrates'})

您还可以提供多个查询词,以匹配与任何项目匹配的行:
r.db('music').table('catalog').getAll('mp3', '128K', {index: 'bitrates'})

但是,如果单个文档与查询中的多个术语匹配,它将被多次返回。要解决此问题,请添加 distinct() :
r.db('music').table('catalog').getAll('mp3', '128K', {index: 'bitrates'}).distinct()

如有必要,您也可以考虑使用 downcase()规范二级索引中使用的术语的大小写。

您也可以完全跳过所有索引业务并使用 filter()询问:
r.db('music').table('catalog').filter(function(row) {
return row('bitrates').map(function(bitrates) {
return [bitrates('format'), bitrates('rate')];
}).reduce(function(left, right) {
return left.setUnion(right);
}).contains('mp3');
})

也就是说,如果您几乎总是以相同的方式查询您的表,那么使用自定义函数生成二级索引将显着提高性能。

关于rethinkdb - 如何在 RethinkDB 中通过对象数组查询多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29415233/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com