IBM Cloud Docs
使用 IBM Cloudant 查询

使用 IBM Cloudant 查询

在本教程中,我们演示了如何创建索引并使用索引来查询数据库。 您还学会创建不同类型的查询以更轻松地查找数据。

在此,您可以从命令行运行命令,但也可以使用 IBM® Cloudant® for IBM Cloud® 仪表板来完成这些任务,这为您提供了每个任务的可视示例。 有关仪表板的更多信息,请参阅 使用 IBM Cloudant 仪表板 教程。

准备工作

开始之前,请遵循以下教程来创建实例,然后创建并填充数据库。

  1. 创建 IBM Cloudant 实例
  2. 创建数据库
  3. 填充数据库
  4. (可选) 创建 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 索引。 最糟糕的情况下,将按标识返回所有文档(全表扫描)。 处理全表扫描的成本很高。 建议您创建索引。

要创建索引,请执行以下步骤:

  1. 将以下样本 JSON 数据复制到名为 query-demo-index.json的文件中:

      {
      	"index": {
      		"fields": [
      			"descriptionField",
      			"temperatureField"
      		],
      		"partial_filter_selector": {
      			"descriptionField": {
      				"$eq": "hot"
      			},
      			"temperatureField": {
      				"$gt": 50
      			}
      		}
      	},
      	"ddoc": "query-demo-index",
      	"type": "json"
      }
    
  2. 运行以下命令创建索引:

      acurl "https://$ACCOUNT.cloudant.com/databasedemo/_index" \
        -X POST \
        -H "Content-Type: application/json" \
        -d \@query-demo-index.json
    
  3. 查看结果:

      {
      	"result": "created",
      	"id": "_design/query-demo-index",
      	"name": "490441584f9eddb8d09ef234d636b5f3b18e4ce6"
      }
    

您无需创建索引即可运行查询。 但是,如果您不这样做,那么结果中将包含以下警告作为一个指示符,指示创建索引将减少处理并使查询更有效。 "Warning": "No matching index found, create an index to optimize query time."

运行简单查询

此示例演示 IBM Cloudant Query 如何根据值为 boilingdescriptionField 来查找文档。

要运行查询,请执行以下步骤:

  1. 将以下样本 JSON 复制到名为 query1.json的数据文件中:
     {
      "selector": {
        "descriptionField": "boiling"
       }
     }
    
  2. 运行以下命令查询数据库:
      acurl "https://$ACCOUNT.cloudant.com/databasedemo/_find" \
        -X POST \
        -H "Content-Type: application/json" \
        -d \@query1.json
    
  3. 查看查询结果:
      {
      	"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 参数指定要包含在结果中的字段。 在我们的示例中,结果包括 nameFielddescriptionFieldtemperatureField,如以下示例中所示。

  {
  	...
  	"fields": [
  		"nameField",
  		"descriptionField",
  		"temperatureField"
  	]
  }

要运行查询,请执行以下步骤:

  1. 将样本 JSON 复制到名为 query2.json的数据文件中。
      {
      	"selector": {
      		"descriptionField": "freezing",
      		"temperatureField": -5
      	},
      	"fields": [
      		"nameField",
      		"descriptionField",
      		"temperatureField"
      	]
      }
    
  2. 运行以下命令查询数据库:
      acurl "https://$ACCOUNT.cloudant.com/databasedemo/_find" \
        -X POST \
        -H "Content-Type: application/json" \
        -d \@query2.json
    
  3. 查看查询结果:
    {
    	"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的描述的文档。 结果包括 descriptionFieldtemperatureField,按温度降序显示。

使用类似于以下示例的选择器表达式:

  {
  	"selector": {
  		"temperatureField": {
  			"$gt": 50
  		},
  		"descriptionField": {
  			"$eq": "hot"
  		}
  	},
  	"fields": [
  		"descriptionField",
  		"temperatureField"
  	],
  	"sort": [{
  		"temperatureField": "desc"
  	}],
  	"use_index": "_design/query-demo-index"
  }

要运行查询,请执行以下步骤:

  1. 将以下样本 JSON 复制到名为 query3.json的文件。
      {
      	"selector": {
      		"descriptionField": {
      			"$eq": "hot"
      		},
      		"temperatureField": {
      			"$gt": 50
      		}
      	},
      	"fields": [
      		"descriptionField",
      		"temperatureField"
      	],
      	"sort": [{
      		"temperatureField": "desc"
      	}],
      	"use_index": "_design/query-demo-index"
      }
    
  2. 运行以下查询:
      acurl "https://$ACCOUNT.cloudant.com/databasedemo/_find" \
        -X POST \
        -H "Content-Type: application/json" \
        -d \@query3.json
    
  3. 查看查询结果:
    {
    	"docs": [{
    			"descriptionField": "hot",
    			"temperatureField": 97
    		},
    		{
    			"descriptionField": "hot",
    			"temperatureField": 75
    		}
    	],
    	"bookmark": "g1AAAABbeJzLYWBgYMpgSmHgKy5JLCrJTq2MT8lPzkzJBYorJBoYmKWaWVokpZkamJtaGJskm5slmSenGhulWpibJhqC9HHA9OWATErUAGlkzsgvycoCAEsUF_A"
    }
    

现在,您知道如何使用 IBM Cloudant 查询从数据库中抽取数据。 有关更多信息,请参阅 IBM Cloudant 文档