定义
rangerange操作符支持对数字、日期和字符串值进行查询和评分。您可以使用此操作符查找给定数字、日期、objectId 或字母(英文字母表)范围内的结果。range支持查询以下数据类型:number,包括
int32、int64和double
语法
range 通过以下语法实现:
{ "$search": { "index": <index name>, // optional, defaults to "default" "range": { "path": "<field-to-search>", "gt | gte": <value-to-search>, "lt | lte": <value-to-search>, "score": <score-options>, "doesNotAffect": "<facet-to-exclude>" | [<array-of-facets>] } }}选项
range 使用以下词条来构造查询:
字段 | 类型 | 说明 | 必要性 |
|---|---|---|---|
| BSON 日期、数字、字符串或 objectId | no | |
| BSON 日期、数字、字符串或 objectId | no | |
| 字符串或字符串数组 | 要搜索的一个或多个带索引字段。 | 是 |
| 对象 | 修改分配给匹配搜索结果的分数。您可以使用以下选项修改默认分数:
查询大量值时,如果大量中的更多值与查询匹配, MongoDB Search 会分配更高的分数。 有关在查询中使用 | no |
| 字符串或字符串数组 | 要从基于此查询的计数重新计算中排除的分面(Facet)或分面(Facet)列表。值必须是 | no |
示例
以下示例使用示例数据中的集合。如果您在集群上加载了示例数据,则可以使用以下示例中的索引定义创建索引,并在集群上运行示例查询。
数字示例
以下示例使用 示例数据 中数值字段上的索引,并对索引字段运行 range 查询。
对于本示例,您可以使用静态或动态映射为 sample_mflix.movies 集合中的 runtime 字段建立索引。该查询使用 gte 和 lte 字段来定义要搜索的数字范围。
样本索引
使用以下索引定义之一:
样本查询
以下查询搜索运行时间大于或等于 2 且小于或等于 3 的电影。它包括 $limit 阶段,用于将输出限制为 5 个结果,以及 $project 阶段,用于排除 title 和 runtime 之外的所有字段。
db.movies.aggregate([ { "$search": { "range": { "path": "runtime", "gte": 2, "lte": 3 } } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "runtime": 1 } }])对于本示例,您可以使用静态或动态映射为 sample_mflix.movies 集合中的 runtime 字段建立索引。该查询使用 lte 字段,搜索所有小于或等于给定值的值。
样本索引
使用以下索引定义之一:
样本查询
以下查询搜索运行时间小于或等于2的所有电影。 它包括一个用于将输出限制为5结果的$limit阶段和用于执行以下操作的$project阶段:
排除
title和runtime之外的所有字段添加字段
score
db.movies.aggregate([ { "$search": { "range": { "path": "runtime", "lte": 2 } } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "runtime": 1, score: { $meta: "searchScore" } } }])以下示例为sample_analytics.customers集合中所有动态可索引字段(包括具有数值数组的字段)动态编制索引。 示例查询使用 gte 和 lte 字段在Atlas Search中查找数值数组中给定值之间的所有值。
样本索引
以下名为default的索引定义动态索引所有字段,包括accounts字段,它是一个数值数组。
{ "mappings": { "dynamic": true }}样本查询
以下查询搜索250000和300000之间的客户帐户。 它包括一个$limit阶段,用于将输出限制为5结果;以及一个$project阶段,用于排除除accounts和name之外的所有字段。
db.customers.aggregate([ { "$search": { "range": { "path": "accounts", "gt": 250000, "lt": 400000 } } }, { "$limit": 5 }, { "$project": { "_id": 0, "accounts": 1, "name": 1 } }])日期示例
以下示例使用 range 运算符查询sample_mflix.movies 集合中的日期字段。对于本示例,您可以使用静态或动态映射为集合中名为 released 的 date 类型字段建立索引。
样本索引
使用以下索引定义之一:
样本查询
以下查询搜索 2010 年 1 月 1 日至 2015年 1 月 1 日之间上映的电影。它包括一个 $limit 阶段,用于将输出限制为 5 个结果,以及一个 $project 阶段,用于排除 title 和 released 之外的所有字段。
db.movies.aggregate([ { "$search": { "range": { "path": "released", "gt": ISODate("2010-01-01T00:00:00.000Z"), "lt": ISODate("2015-01-01T00:00:00.000Z") } } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "released": 1 } }])ObjectId 示例
以下示例使用 range 操作符查询 sample_mflix.movies 集合中的 objectId 字段。对于本示例,您可以使用静态或动态映射为集合中名为 _id 的 objectId 类型字段建立索引。
样本索引
使用以下索引定义之一:
样本查询
以下示例使用 range 操作符在 _id 字段中查询 sample_mflix.movies 集合中的一系列 objectId 值。
db.movies.aggregate([ { "$search": { "range": { "path": "_id", "gte": ObjectId("573a1396f29313caabce4a9a"), "lte": ObjectId('573a1396f29313caabce4ae7') } } }, { "$project": { "_id": 1, "title": 1, "released": 1 } }])字符串示例
以下示例使用 range操作符查询sample_mflix.movies集合中的字符串字段。 对于本示例,您必须使用静态映射将集合中名为 title 的字段索引为MongoDB Search token 类型。
样本索引
以下名为 default 的索引定义将 movies集合中的 title字段索引为MongoDB Search token 类型:
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "token", "normalizer": "lowercase" } } }}样本查询
以下查询搜索包含 city 和 country 之间的字符的电影标题。它包括一个 $limit 阶段,用于将输出限制为 5 个结果,以及一个 $project 阶段,用于排除除 title 之外的所有字段。
db.movies.aggregate([ { "$search": { "range": { "path": "title", "gt": "city", "lt": "country" } } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1 } }])嵌入式文档示例
以下查询在 sample_training.companies 集合的 funding_rounds.raised_amount 字段中搜索大于或等于 500000 且小于或等于 1000000 的金额。使用 returnStoredSource: true 和 returnScope 检索并返回 funding_rounds 对象数组中的字段,这些字段存储在 mongot 上。该查询使用对存储源使用相对路径示例中的示例索引。
➤ 在 Search Playground 中尝试此功能。MongoDB Search Playground 中的结果可能会有所不同,因为 MongoDB Search Playground 中的数据比以下示例中使用的示例集合要小。
db.companies.aggregate([ { "$search": { "range": { "path": "funding_rounds.raised_amount", "gte": 500000, "lte": 1000000 }, "returnStoredSource": true, "returnScope": { "path": "funding_rounds" } } }, { "$limit": 5 }])元数据示例
以下查询搜索运行时间大于或等于 2 且小于或等于 3 的电影。该查询使用$searchMeta阶段检索符合搜索条件的以下时间段(年)中的所有电影:
1990,包括此存储桶的下限
2000,1990 存储桶的不含上限以及此存储桶的包含下限
2010,2000 存储桶的不含上限以及此存储桶的包含下限
2020,2010 存储桶的独占上限
该查询使用名为 default 的索引,该索引会对 sample_mflix.movies 命名空间中的所有字段进行动态索引。
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "runtime", "gte": 2, "lte": 3 } }, "facets": { "yearFacet": { "type": "number", "path": "year", "boundaries": [1990, 2000, 2010, 2020 ] } } } } }])