步骤 4:查询和扫描数据 - Amazon DynamoDB
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

步骤 4:查询和扫描数据

您可以使用 query 方法来检索表中的数据。您必须指定分区键值。排序键可选。

Movies 表的主键由以下部分组成:

  • year – 分区键。属性类型是 number。 

  • title – 排序键。属性类型是 string

要查找一年中发行的所有电影,您只需指定 year。 您还可以提供 title 以根据某种条件(在排序键上)检索电影子集。例如,您可以查找在 2014 年发行并且标题以字母“A”开头的电影。

除了 query 方法外,您还可以使用 scan 方法检索所有表数据。

要了解有关查询和扫描数据的更多信息,请分别参阅在 DynamoDB 中使用查询在 DynamoDB 中使用扫描

步骤 4.1:查询 - 一年中发行的所有电影

以下程序检索在 year 1985 发行的所有电影。

  1. 将以下程序复制并粘贴到名为 MoviesQuery01.rb 的文件中。

    require 'aws-sdk-dynamodb' def query_for_items_from_table(dynamodb_client, query_condition) # To display the elapsed time for the query operation, # uncomment the following three comments. # start = Time.now result = dynamodb_client.query(query_condition) # finish = Time.now # puts "Search took #{finish - start} seconds." if result.items.count.zero? puts 'No matching movies found.' else puts "Found #{result.items.count} matching movies:" result.items.each do |movie| puts "#{movie['title']} (#{movie['year'].to_i})" end end rescue StandardError => e puts "Error querying for table items: #{e.message}" end def run_me region = 'us-west-2' table_name = 'Movies' year = 1985 # To use the downloadable version of Amazon DynamoDB, # uncomment the endpoint statement. Aws.config.update( # endpoint: 'http://localhost:8000', region: region ) dynamodb_client = Aws::DynamoDB::Client.new # To query on the 'title' range/sort key in addition to the 'year' # hash/partition key, uncomment the following three 'title' comments. query_condition = { table_name: table_name, key_condition_expression: '#yr = :yyyy', # '#yr = :yyyy AND #t = :title' expression_attribute_names: { # '#t' => 'title', '#yr' => 'year' }, expression_attribute_values: { # ':title' => 'After Hours', ':yyyy' => year } } puts "Searching for items in the '#{table_name}' table from '#{year}'..." query_for_items_from_table(dynamodb_client, query_condition) end run_me if $PROGRAM_NAME == __FILE__
    注意
    • expression_attribute_names 提供名称替换功能。我们使用此参数是因为 year 是 Amazon DynamoDB 中的保留字。您不能直接在任何表达式中使用它,包括 KeyConditionExpression。 您可以使用表达式属性名称 #yr 来解决此问题。

    • expression_attribute_values 提供值替换功能。使用此参数是因为您不能在任何表达式(包括 key_condition_expression)中使用文本。 您可以使用表达式属性值 :yyyy 来解决此问题。

  2. 要运行该程序,请输入以下命令。

    ruby MoviesItemQuery01.rb

注意

前面的程序演示了如何按主键属性对表进行查询。在 DynamoDB 中,您可以选择在表上创建一个或多个二级索引,并采用查询表的相同方法来查询这些索引。二级索引允许对非键属性进行查询,从而为您的应用程序带来额外的灵活性。有关更多信息,请参阅使用二级索引改进数据访问

步骤 4.2:查询 – 一年中发行的所有具有特定标题的电影

以下程序检索 year 1992 发行并且 title 以字母“A”到字母“L”开头的所有电影。

  1. 将以下程序复制并粘贴到名为 MoviesQuery02.rb 的文件中。

    require 'aws-sdk-dynamodb' def query_for_items_from_table(dynamodb_client, query_condition) # To display the elapsed time for the query operation, # uncomment the following three comments. # start = Time.now result = dynamodb_client.query(query_condition) # finish = Time.now # puts "Search took #{finish - start} seconds." if result.items.count.zero? puts 'No matching movies found.' else puts "Found #{result.items.count} matching movies:" result.items.each do |movie| puts "#{movie['title']} (#{movie['year'].to_i}):" if movie['info'].key?('genres') && movie['info']['genres'].count.positive? puts ' Genres:' movie['info']['genres'].each do |genre| puts " #{genre}" end end if movie['info'].key?('actors') && movie['info']['actors'].count.positive? puts ' Actors:' movie['info']['actors'].each do |actor| puts " #{actor}" end end end end rescue StandardError => e puts "Error querying for table items: #{e.message}" end def run_me region = 'us-west-2' table_name = 'Movies' year = 1982 letter1 = 'A' letter2 = 'L' # To use the downloadable version of Amazon DynamoDB, # uncomment the endpoint statement. Aws.config.update( # endpoint: 'http://localhost:8000', region: region ) dynamodb_client = Aws::DynamoDB::Client.new query_condition = { table_name: table_name, projection_expression: '#yr, title, info.genres, info.actors[0]', key_condition_expression: '#yr = :yyyy AND title BETWEEN :letter1 AND :letter2', expression_attribute_names: { '#yr' => 'year' }, expression_attribute_values: { ':yyyy' => year, ':letter1' => letter1, ':letter2' => letter2 } } puts "Searching for items in the '#{table_name}' table from '#{year}' and " \ "titles starting with the letters '#{letter1}' through '#{letter2}'..." query_for_items_from_table(dynamodb_client, query_condition) end run_me if $PROGRAM_NAME == __FILE__
  2. 要运行该程序,请输入以下命令。

    ruby MoviesQuery02.rb

步骤 4.3:Scan

scan 方法将读取整个表中的所有项目,并返回表中的所有数据。您可提供一个可选的 filter_expression,以便仅返回符合条件的项目。但请注意,仅在扫描整个表后应用筛选器。

以下程序将扫描 Movies 表,其中包含约 5000 个项目。扫描时可指定可选筛选条件,以便仅检索 20 世纪 50 年代以来的电影 (约 100 个项目),同时舍弃所有其他项目。

  1. 将以下程序复制并粘贴到名为 MoviesScan.rb 的文件中。

    require 'aws-sdk-dynamodb' def scan_for_items_from_table(dynamodb_client, scan_condition) # To display the elapsed time for the query operation, # uncomment the following three comments. #start = Time.now loop do result = dynamodb_client.scan(scan_condition) if result.items.count.zero? puts 'No matching movies found (yet)...' else puts "Found #{result.items.count} matching movies (so far):" result.items.each do |movie| puts "#{movie["title"]} (#{movie["year"].to_i}), " \ "Rating: #{movie["info"]["rating"].to_f}" end break if result.last_evaluated_key.nil? puts "Searching for more movies..." scan_condition[:exclusive_start_key] = result.last_evaluated_key end end puts 'Finished searching.' # finish = Time.now # puts "Search took #{finish - start} seconds." rescue StandardError => e puts "Error scanning for table items: #{e.message}" end def run_me region = 'us-west-2' table_name = 'Movies' start_year = 1950 end_year = 1959 # To use the downloadable version of Amazon DynamoDB, # uncomment the endpoint statement. Aws.config.update( # endpoint: 'http://localhost:8000', region: region ) dynamodb_client = Aws::DynamoDB::Client.new scan_condition = { table_name: table_name, projection_expression: '#yr, title, info.rating', filter_expression: '#yr between :start_yr and :end_yr', expression_attribute_names: { '#yr' => 'year' }, expression_attribute_values: { ':start_yr' => start_year, ':end_yr' => end_year } } puts "Searching for items in the '#{table_name}' table from #{start_year} " \ "through #{end_year}..." scan_for_items_from_table(dynamodb_client, scan_condition) end run_me if $PROGRAM_NAME == __FILE__

    在代码中,请注意以下情况:

    • projection_expression 用于指定要在扫描结果中包含的属性。

    • filter_expression 用于指定一个条件,以便仅返回符合条件的项目。所有其他项目都将被舍弃。

  2. 要运行该程序,请输入以下命令。

    ruby MoviesScan.rb

注意

您还可以将 scan 方法用于您在表上创建的任何二级索引。有关更多信息,请参阅使用二级索引改进数据访问