对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

range (MongoDB搜索操作符)

range

range 操作符支持对数字、日期和字符串值进行查询和评分。您可以使用此操作符查找给定数字、日期、objectId 或字母(英文字母表)范围内的结果。

range 支持查询以下数据类型:

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 使用以下词条来构造查询:

字段
类型
说明
必要性

gt or gte

BSON 日期、数字、字符串或 objectId

查找大于 (>) 或大于或等于 (>=) 给定值的值。

  • 对于数字字段,值可以是 int32、int64 或 double 数据类型。

  • 对于日期字段,值必须是 :ISODate 格式的日期。

  • 对于字符串字段,必须将该值编制索引为MongoDB Search token 类型。

  • 对于 ObjectId 字段,必须将其值索引为objectId 数据类型,或者将动态映射设置为 true。

no

lt or lte

BSON 日期、数字、字符串或 objectId

查找小于 (<) 或小于或等于 (<=) 给定值的值。

  • 对于数字字段,值可以是 int32、int64 或 double 数据类型。

  • 对于日期字段,值必须是 :ISODate 格式的日期。

  • 对于字符串字段,必须将该值编制索引为MongoDB Search token 类型。

  • 对于 ObjectId 字段,必须将其值索引为objectId 数据类型,或者将动态映射设置为 true。

no

path

字符串或字符串数组

要搜索的一个或多个带索引字段。

是

score

对象

修改分配给匹配搜索结果的分数。您可以使用以下选项修改默认分数:

  • boost将生成的分数乘以给定数字。

  • constant将结果分数替换为给定数字。

  • function:使用给定的表达式替换结果分数。

查询大量值时,如果大量中的更多值与查询匹配, MongoDB Search 会分配更高的分数。

有关在查询中使用 score 的信息,请参阅对结果中的文档进行评分。

no

doesNotAffect

字符串或字符串数组

要从基于此查询的计数重新计算中排除的分面(Facet)或分面(Facet)列表。值必须是 $search.facets 或 $searchMeta.facets 中定义的分面(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 } }])

以下示例使用 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 } }])

以下示例使用 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 ] } } } } }])