Overview
在本指南中,您可以学习;了解如何使用Ruby驾驶员指定查询。
您可以通过创建查询过滤来优化查询返回的文档设立。 查询过滤是一个表达式,用于指定MongoDB在读取或写入操作中用于匹配文档的搜索条件。 在查询过滤中,您可以提示驾驶员搜索与查询完全匹配的文档,也可以组合查询筛选器以Express更复杂的匹配条件。
样本数据
本指南中的示例对 fruits
集合运行操作,该集合包含表示水果的文档。以下代码示例展示了如何创建数据库和集合,然后将示例文档插入集合:
database = client.use('db') collection = database[:fruits] # Inserts documents representing fruits fruits = [ { _id: 1, name: 'apples', qty: 5, rating: 3, color: 'red', type: ['fuji', 'honeycrisp'] }, { _id: 2, name: 'bananas', qty: 7, rating: 4, color: 'yellow', type: ['cavendish'] }, { _id: 3, name: 'oranges', qty: 6, rating: 2, type: ['naval', 'mandarin'] }, { _id: 4, name: 'pineapples', qty: 3, rating: 5, color: 'yellow' } ] collection.insert_many(fruits)
精确匹配
字面值查询返回与查询过滤完全匹配的文档。
以下示例将查询过滤指定为find
方法的参数。 此代码会返回color
字段的值为'yellow'
的所有文档:
filter = { color: 'yellow' } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>2, "name"=>"bananas", "qty"=>7, "rating"=>4, "color"=>"yellow", "type"=>["cavendish"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
注意
查找所有文档
要查找集合中的所有文档,请调用 find
方法而不传递任何参数:
results = collection.find
比较操作符。
比较操作符会根据查询过滤中的指定值评估文档字段值。以下列表描述了常见的比较操作符:
$gt
:返回给定字段的值大于指定值的文档$lte
:返回给定字段的值小于或等于指定值的文档$ne
:返回给定字段的值不等于指定值的文档
提示
要查看比较操作符的完整列表,请参阅 MongoDB Server 手册中的比较查询操作符指南。
以下示例将查询过滤中的操作符指定为find
方法的参数。 此代码会返回rating
字段值大于2
的所有文档:
filter = { rating: { '$gt' => 2 } } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>1, "name"=>"apples", "qty"=>5, "rating"=>3, "color"=>"red", "type"=>["fuji", "honeycrisp"]} {"_id"=>2, "name"=>"bananas", "qty"=>7, "rating"=>4, "color"=>"yellow", "type"=>["cavendish"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
逻辑操作符
逻辑操作符通过使用应用于两组或多组表达式结果的逻辑来匹配文档。 以下列表描述了每个逻辑操作符:
$and
:返回符合所有子句条件的文档$or
:返回与一个子句的条件匹配的文档$nor
:返回与任何子句的条件都不匹配的文档$not
:返回与表达式不匹配的文档
提示
要了解有关逻辑操作符的更多信息,请参阅 MongoDB Server 手册中的逻辑查询操作符指南。
以下示例将查询中的逻辑操作符过滤为 find
方法的参数。此代码将返回 qty
字段值大于 5
或 color
字段值为 'yellow'
的所有文档:
filter = { '$or' => [{ qty: { '$gt' => 5 } }, { color: 'yellow' }] } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>2, "name"=>"bananas", "qty"=>7, "rating"=>4, "color"=>"yellow", "type"=>["cavendish"]} {"_id"=>3, "name"=>"oranges", "qty"=>6, "rating"=>2, "type"=>["naval", "mandarin"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
数组操作符
数组操作符根据大量字段中元素的值或数量来匹配文档。以下列表描述了每个大量操作符:
$all
:返回具有包含查询中所有元素的数组的文档$elemMatch
:如果大量字段中的元素与查询中的所有条件匹配,则返回文档$size
:返回包含指定大小数组的文档
提示
要了解有关数组操作符的更多信息,请参阅 MongoDB Server 手册中的数组查询操作符指南。
以下示例将查询过滤中的大量操作符指定为find
方法的参数。 此代码会返回type
大量字段包含2
元素的所有文档:
filter = { type: { '$size' => 2 } } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>1, "name"=>"apples", "qty"=>5, "rating"=>3, "color"=>"red", "type"=>["fuji", "honeycrisp"]} {"_id"=>3, "name"=>"oranges", "qty"=>6, "rating"=>2, "type"=>["naval", "mandarin"]}
元素操作符
元素操作符根据字段的存在或类型查询数据。以下列表描述了每个元素操作符:
$exists
:返回包含指定字段的文档$type
:返回包含指定类型字段的文档
提示
要了解有关元素操作符的更多信息,请参阅 MongoDB Server 手册中的元素查询操作符指南。
以下示例将查询筛选器中的元素操作符指定为find
方法的参数。 此代码将返回所有具有color
字段的文档:
filter = { color: { '$exists' => true } } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>1, "name"=>"apples", "qty"=>5, "rating"=>3, "color"=>"red", "type"=>["fuji", "honeycrisp"]} {"_id"=>2, "name"=>"bananas", "qty"=>7, "rating"=>4, "color"=>"yellow", "type"=>["cavendish"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
评估操作符
评估操作符根据单个字段或整个集合文档的评估返回数据。以下列表描述了常见的元素操作符:
$text
:对文档执行文本搜索$regex
:返回与指定正则表达式匹配的文档$mod
:对字段值执行模运算,并返回余数为指定值的文档
提示
要查看评估操作符的完整列表,请参阅 MongoDB Server 手册中的评估查询操作符指南。
以下示例将查询过滤中的评估操作符指定为find
方法的参数。 此代码使用正则表达式返回name
字段值至少包含两个连续'p'
字符的所有文档:
filter = { name: /p{2,}/ } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>1, "name"=>"apples", "qty"=>5, "rating"=>3, "color"=>"red", "type"=>["fuji", "honeycrisp"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
注意
当查询过滤包含正则表达式值时, Ruby驾驶员会隐式使用 $regex
操作符,如前面的示例所示。
更多信息
要学习;了解有关查询文档的更多信息,请参阅MongoDB Server手册中的查询文档。
要学习;了解有关使用Ruby驾驶员检索文档的更多信息,请参阅 查找文档指南。
API 文档
要学习;了解有关 find
方法的详情,请参阅API文档。