使用 IBM Cloudant 查询
在本教程中,我们演示了如何创建索引并使用索引来查询数据库。 您还学会创建不同类型的查询以更轻松地查找数据。
在此,您可以从命令行运行命令,但也可以使用 IBM® Cloudant® for IBM Cloud® 仪表板来完成这些任务,这为您提供了每个任务的可视示例。 有关仪表板的更多信息,请参阅 使用 IBM Cloudant 仪表板 教程。
准备工作
开始之前,请遵循以下教程来创建实例,然后创建并填充数据库。
- 创建 IBM Cloudant 实例。
- 创建数据库。
- 填充数据库。
- (可选) 创建
acurl
别名。
如果您决定不设置 acurl
,请将以下 URL 与 curl
配合使用,而不是使用练习中提供的 URL curl "https://$USERNAME:$PASSWORD@$ACCOUNT.cloudant.com/databasedemo"
。
acurl
别名更安全。 它可防止有人在您输入时在您的肩膀上读取您的密码。 它还通过强制实施 HTTPS ,确保您的密码不会以纯文本形式通过网络发送。
现在,我们准备好了解如何对您在 开始之前的步骤 2 中创建的数据库运行查询。
创建索引
IBM Cloudant 查询使用 Mongo 样式的查询语法通过逻辑运算符来搜索文档。 IBM Cloudant 查询是视图和搜索索引的组合。
使用 IBM Cloudant Query 时,查询策划器会查看选择器(您的查询)以确定要从中进行选择的正确索引。 在内存中,您通过选择器过滤掉文档,这就是为什么即使没有索引,您仍然可以使用各种字段进行查询。
如果没有可用的已定义索引与指定的查询匹配,那么 IBM Cloudant 将使用按标识查找文档的 _all_docs
索引。 最糟糕的情况下,将按标识返回所有文档(全表扫描)。 处理全表扫描的成本很高。 建议您创建索引。
要创建索引,请执行以下步骤:
-
将以下样本 JSON 数据复制到名为
query-demo-index.json
的文件中:{ "index": { "fields": [ "descriptionField", "temperatureField" ], "partial_filter_selector": { "descriptionField": { "$eq": "hot" }, "temperatureField": { "$gt": 50 } } }, "ddoc": "query-demo-index", "type": "json" }
-
运行以下命令创建索引:
acurl "https://$ACCOUNT.cloudant.com/databasedemo/_index" \ -X POST \ -H "Content-Type: application/json" \ -d \@query-demo-index.json
-
查看结果:
{ "result": "created", "id": "_design/query-demo-index", "name": "490441584f9eddb8d09ef234d636b5f3b18e4ce6" }
您无需创建索引即可运行查询。 但是,如果您不这样做,那么结果中将包含以下警告作为一个指示符,指示创建索引将减少处理并使查询更有效。 "Warning": "No matching index found, create an index to optimize query time."
运行简单查询
此示例演示 IBM Cloudant Query 如何根据值为 boiling
的 descriptionField
来查找文档。
要运行查询,请执行以下步骤:
- 将以下样本 JSON 复制到名为
query1.json
的数据文件中:{ "selector": { "descriptionField": "boiling" } }
- 运行以下命令查询数据库:
acurl "https://$ACCOUNT.cloudant.com/databasedemo/_find" \ -X POST \ -H "Content-Type: application/json" \ -d \@query1.json
- 查看查询结果:
{ "docs": [{ "_id": "91d1fa833d28efe15069604f98de701d", "_rev": "1-f998fc7b89d4466c1e7bb204b1b00f74", "numberField": 1, "nameField": "one", "descriptionField": "boiling", "temperatureField": 100 }], "bookmark": "g1AAAABweJzLYWBgYMpgSmHgKy5JLCrJTq2MT8lPzkzJBYorWBqmGKYlWhgbpxhZpKalGpoamFmaGZikWVqkpJobGKaA9HHA9BGlIwsAmn8eLw", "warning": "No matching index found, create an index to optimize query time." }
接下来,您可以使用两个字段在数据库中查找文档。
运行具有两个字段的查询
此示例使用两个字段来查找具有以下值的文档: freezing
和 -5
。
使用类似于以下示例的 "selector" 表达式 来描述搜索:
{
"selector": {
"descriptionField": "freezing",
"temperatureField": -5
}
}
您可以通过在选择器表达式中添加更多详细信息来定制结果。
fields
参数指定要包含在结果中的字段。 在我们的示例中,结果包括 nameField
, descriptionField
和 temperatureField
,如以下示例中所示。
{
...
"fields": [
"nameField",
"descriptionField",
"temperatureField"
]
}
要运行查询,请执行以下步骤:
- 将样本 JSON 复制到名为
query2.json
的数据文件中。{ "selector": { "descriptionField": "freezing", "temperatureField": -5 }, "fields": [ "nameField", "descriptionField", "temperatureField" ] }
- 运行以下命令查询数据库:
acurl "https://$ACCOUNT.cloudant.com/databasedemo/_find" \ -X POST \ -H "Content-Type: application/json" \ -d \@query2.json
- 查看查询结果:
{ "docs": [{ "nameField": "eight", "descriptionField": "freezing", "temperatureField": -5 }], "bookmark": "g1AAAABweJzLYWBgYMpgSmHgKy5JLCrJTq2MT8lPzkzJBYorpBiYGJolWaSZmaWYpFqmGBiYmKclphhappqZmRglG5uD9HHA9BGlIwsAms8eJw", "warning": "No matching index found, create an index to optimize query time." }
接下来,使用多个运算符在数据库中查找文档。
运行具有运算符的查询
在此示例中, $gt
(大于) 和 $eq
(等于) 运算符用于搜索包含大于 20
度的温度和包含值 hot
的描述的文档。 结果包括 descriptionField
和 temperatureField
,按温度降序显示。
使用类似于以下示例的选择器表达式:
{
"selector": {
"temperatureField": {
"$gt": 50
},
"descriptionField": {
"$eq": "hot"
}
},
"fields": [
"descriptionField",
"temperatureField"
],
"sort": [{
"temperatureField": "desc"
}],
"use_index": "_design/query-demo-index"
}
要运行查询,请执行以下步骤:
- 将以下样本 JSON 复制到名为
query3.json
的文件。{ "selector": { "descriptionField": { "$eq": "hot" }, "temperatureField": { "$gt": 50 } }, "fields": [ "descriptionField", "temperatureField" ], "sort": [{ "temperatureField": "desc" }], "use_index": "_design/query-demo-index" }
- 运行以下查询:
acurl "https://$ACCOUNT.cloudant.com/databasedemo/_find" \ -X POST \ -H "Content-Type: application/json" \ -d \@query3.json
- 查看查询结果:
{ "docs": [{ "descriptionField": "hot", "temperatureField": 97 }, { "descriptionField": "hot", "temperatureField": 75 } ], "bookmark": "g1AAAABbeJzLYWBgYMpgSmHgKy5JLCrJTq2MT8lPzkzJBYorJBoYmKWaWVokpZkamJtaGJskm5slmSenGhulWpibJhqC9HHA9OWATErUAGlkzsgvycoCAEsUF_A" }
现在,您知道如何使用 IBM Cloudant 查询从数据库中抽取数据。 有关更多信息,请参阅 IBM Cloudant 文档。