范围
定义
语法
range
通过以下语法实现:
1 { 2 "$search": { 3 "index": <index name>, // optional, defaults to "default" 4 "range": { 5 "path": "<field-to-search>", 6 "gt | gte": <value-to-search>, 7 "lt | lte": <value-to-search>, 8 "score": <score-options> 9 } 10 } 11 }
选项
range
使用以下词条来构造查询:
字段 | 类型 | 说明 | 必要性 |
---|---|---|---|
gt 或是 gte | BSON 日期、数字、字符串或 objectId | 没有 | |
lt 或是 lte | BSON 日期、数字、字符串或 objectId | 没有 | |
path | 字符串或字符串数组 | 要搜索的一个或多个带索引字段。请参阅路径构造。 | 是 |
score | 对象 | 修改分配给匹配搜索结果的分数。您可以使用以下选项修改默认分数:
有关在查询中使用 注意当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。 | 没有 |
举例
以下示例使用示例数据的集合。如果您在集群上加载示例数据,则可以使用以下示例的索引定义创建索引,并在集群上运行示例查询。
提示
如果您已经加载示例数据集,请按照 Atlas Search 入门教程,创建索引定义并运行 Atlas Search 查询。
数字示例
以下示例使用示例数据中数值字段的索引,并对索引字段运行 range
查询。
对于本示例,您可以使用静态或动态映射为 sample_mflix.movies
集合中的 runtime
字段建立索引。该查询使用 gte
和 lte
字段来定义要搜索的数字范围。
样本索引
以下名为default
的索引定义为movies
集合中的所有字段编制索引。
1 { 2 "mappings": { 3 "dynamic": true 4 } 5 }
下列名为 default
的索引定义仅对 movies
集合中的 runtime
字段编制索引。
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "runtime": { 6 "type": "number" 7 } 8 } 9 } 10 }
样本查询
以下查询搜索运行时间大于或等于2
且小于或等于3
的电影。它包括一个$limit
阶段,用于将输出限制为5
结果;以及一个$project
阶段,用于排除除title
和runtime
之外的所有字段。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "runtime", 6 "gte": 2, 7 "lte": 3 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1, 18 "runtime": 1 19 } 20 } 21 ])
对于本示例,您可以使用静态或动态映射为sample_mflix.movies
集合中的runtime
字段建立索引。该查询使用lte
字段搜索小于或等于给定值的所有值。
样本索引
以下名为default
的索引定义为movies
集合中的runtime
字段编制索引。
1 { 2 "mappings": { 3 "dynamic": true 4 } 5 }
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "runtime": { 6 "type": "number" 7 } 8 } 9 } 10 }
样本查询
以下查询搜索运行时间小于或等于2
的所有电影。 它包括一个用于将输出限制为5
结果的$limit
阶段和用于执行以下操作的$project
阶段:
排除
title
和runtime
之外的所有字段添加字段
score
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "runtime", 6 "lte": 2 7 } 8 } 9 }, 10 { 11 "$limit": 5 12 }, 13 { 14 "$project": { 15 "_id": 0, 16 "title": 1, 17 "runtime": 1, 18 score: { $meta: "searchScore" } 19 } 20 } 21 ])
以下示例为sample_analytics.customers
集合中所有动态可索引字段(包括具有数值数组的字段)动态编制索引。 示例查询使用 gte
和 lte
字段在Atlas Search中查找数值数组中给定值之间的所有值。
样本索引
以下名为default
的索引定义动态索引所有字段,包括accounts
字段,它是一个数值数组。
{ "mappings": { "dynamic": true } }
样本查询
以下查询搜索250000
和300000
之间的客户帐户。 它包括一个$limit
阶段,用于将输出限制为5
结果;以及一个$project
阶段,用于排除除accounts
和name
之外的所有字段。
1 db.customers.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "accounts", 6 "gt": 250000, 7 "lt": 400000 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "accounts": 1, 18 "name": 1 19 } 20 } 21 ])
日期示例
以下示例使用 range
运算符查询sample_mflix.movies
集合中的日期字段。对于本示例,您可以使用静态或动态映射为集合中名为 released
的 date
类型字段建立索引。
样本索引
以下名为 default
的索引定义为 movies
集合中的所有动态可索引字段编制索引,包括 date
类型的 released
字段。
{ "mappings": { "dynamic": true } }
以下名为default
的索引定义为movies
集合中的released
字段编制索引:
{ "mappings": { "dynamic": false, "fields": { "released": { "type": "date" } } } }
样本查询
以下查询搜索 2010 年 1 月 1 日至 2015年 1 月 1 日之间上映的电影。它包括一个 $limit
阶段,用于将输出限制为 5 个结果,以及一个 $project
阶段,用于排除 title
和 released
之外的所有字段。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "released", 6 "gt": ISODate("2010-01-01T00:00:00.000Z"), 7 "lt": ISODate("2015-01-01T00:00:00.000Z") 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1, 18 "released": 1 19 } 20 } 21 ])
ObjectId 示例
以下示例使用range
操作符查询sample_mflix.movies
集合中的objectId
字段。对于本示例,您可以使用静态或动态映射为集合中名为_id
的objectId
类型字段建立索引。
样本索引
以下名为default
的索引定义为movies
集合中的所有字段编制索引。
以下名为 default
的索引定义为 movies
集合中的所有动态可索引字段编制索引,包括 objectId
类型的 _id
字段。
{ "mappings": { "dynamic": true } }
以下名为default
的索引定义为movies
集合中的_id
字段编制索引:
{ "mappings": { "dynamic": false, "fields": { "_id": { "type": "objectId" } } } }
样本查询
以下示例使用range
操作符查询_id
字段,以了解sample_mflix.movies
集合中的一系列objectId
值。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "_id", 6 "gte": ObjectId("573a1396f29313caabce4a9a"), 7 "lte": ObjectId('573a1396f29313caabce4ae7') 8 } 9 } 10 }, 11 { 12 "$project": { 13 "_id": 1, 14 "title": 1, 15 "released": 1 16 } 17 } 18 ])
字符串示例
以下示例使用 range
运算符查询 sample_mflix.movies
集合中的字符串字段。对于本示例,您必须使用静态映射将集合中名为 title
的字段索引为 Atlas Search token
类型。
样本索引
以下名为 default
的索引定义将 movies
集合中的 title
字段索引为 Atlas Search token
类型:
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "token", "normalizer": "lowercase" } } } }
样本查询
以下查询搜索包含 city
和 country
之间的字符的电影标题。它包括一个 $limit
阶段,用于将输出限制为 5 个结果,以及一个 $project
阶段,用于排除除 title
之外的所有字段。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "title", 6 "gt": "city", 7 "lt": "country" 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1 18 } 19 } 20 ])