Docs 菜单
Docs 主页
/
MongoDB Atlas
/ / / /

范围

在此页面上

  • 定义
  • 语法
  • 选项
  • 示例
  • 数字示例
  • 日期示例
  • ObjectId 示例
  • 字符串示例
range

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

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

  • number,包括 int32int64double

  • 日期

  • string,作为 Atlas Search token 类型进行索引

  • ObjectId

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 or gte
BSON 日期、数字、字符串或 objectId

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

  • 对于数字字段,值可以是 int32int64double 数据类型。

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

  • 对于字符串字段,值必须按 Atlas Search token 类型进行索引。

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

no
lt or lte
BSON 日期、数字、字符串或 objectId

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

  • 对于数字字段,值可以是 int32int64double 数据类型。

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

  • 对于字符串字段,值必须按 Atlas Search token 类型进行索引。

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

no
path
字符串或字符串数组
要搜索的一个或多个带索引字段。请参阅路径构造
score
对象

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

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

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

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

当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。

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

no

以下示例使用示例数据的集合。如果您在集群上加载示例数据,则可以使用以下示例的索引定义创建索引,并在集群上运行示例查询。

提示

如果您已经加载示例数据集,请按照 Atlas Search 入门教程,创建索引定义并运行 Atlas Search 查询。

以下示例使用示例数据中数值字段的索引,并对索引字段运行 range 查询。

对于本示例,您可以使用静态或动态映射为 sample_mflix.movies 集合中的 runtime 字段建立索引。该查询使用 gtelte 字段来定义要搜索的数字范围。

下列名为 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 阶段,用于排除 titleruntime 之外的所有字段。

1db.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])
{ "runtime" : 3, "title" : "Dots" }
{ "runtime" : 3, "title" : "Sisyphus" }
{ "runtime" : 3, "title" : "The Fly" }
{ "runtime" : 2, "title" : "Andrè and Wally B." }
{ "runtime" : 2, "title" : "Luxo Jr." }

对于本示例,您可以使用静态或动态映射为 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阶段:

  • 排除 titleruntime 之外的所有字段

  • 添加字段 score

1db.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])
{ "runtime" : 1, "title" : "Blacksmith Scene", "score" : 1 }
{ "runtime" : 2, "title" : "Andrè and Wally B.", "score" : 1 }
{ "runtime" : 2, "title" : "Luxo Jr.", "score" : 1 }
{ "runtime" : 1, "title" : "The Kiss", "score" : 1 }
{ "runtime" : 1, "title" : "Dickson Experimental Sound Film", "score" : 1 }

以下示例为sample_analytics.customers集合中所有动态可索引字段(包括具有数值数组的字段)动态编制索引。 示例查询使用 gtelte 字段在Atlas Search中查找数值数组中给定值之间的所有值。

以下名为default的索引定义动态索引所有字段,包括accounts字段,它是一个数值数组。

{
"mappings": {
"dynamic": true
}
}

以下查询搜索250000300000之间的客户帐户。 它包括一个$limit阶段,用于将输出限制为5结果;以及一个$project阶段,用于排除除accountsname之外的所有字段。

1db.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])
1[
2 {
3 name: 'Elizabeth Ray',
4 accounts: [ 371138, 324287, 276528, 332179, 422649, 387979 ]
5 },
6 {
7 name: 'Katherine David',
8 accounts: [ 462501, 228290, 968786, 515844, 377292 ]
9 },
10 {
11 name: 'Brad Cardenas',
12 accounts: [ 721914, 817222, 973067, 260799, 87389 ]
13 },
14 {
15 name: 'Gary Nichols',
16 accounts: [ 385397, 337979, 325377, 440243, 586395, 86702 ]
17 },
18 { name: 'Jennifer Lawrence', accounts: [ 344885, 839927, 853542 ] }
19]

以下示例使用 range 运算符查询sample_mflix.movies 集合中的日期字段。对于本示例,您可以使用静态或动态映射为集合中名为 releaseddate 类型字段建立索引。

以下名为 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 阶段,用于排除 titlereleased 之外的所有字段。

1db.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])
1[
2 {
3 title: 'Too Much Johnson',
4 released: ISODate('2014-08-30T00:00:00.000Z')
5 },
6 {
7 title: 'Stolen Desire',
8 released: ISODate('2012-07-01T00:00:00.000Z')
9 },
10 {
11 title: 'The Monkey King',
12 released: ISODate('2012-01-12T00:00:00.000Z')
13 },
14 { title: 'The Land', released: ISODate('2012-08-04T00:00:00.000Z') },
15 {
16 title: 'My Childhood',
17 released: ISODate('2013-07-31T00:00:00.000Z')
18 }
19]

以下示例使用 range 操作符查询 sample_mflix.movies 集合中的 objectId 字段。对于本示例,您可以使用静态或动态映射为集合中名为 _idobjectId 类型字段建立索引。

下列名为 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 值。

1db.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])
1[
2 {
3 _id: ObjectId('573a1396f29313caabce4a9a'),
4 title: 'The Godfather',
5 released: ISODate('1972-03-24T00:00:00.000Z')
6 },
7 {
8 _id: ObjectId('573a1396f29313caabce4a9b'),
9 title: 'Get to Know Your Rabbit',
10 released: ISODate('1972-06-01T00:00:00.000Z')
11 },
12 {
13 _id: ObjectId('573a1396f29313caabce4aad'),
14 title: 'The Tall Blond Man with One Black Shoe',
15 released: ISODate('1973-08-30T00:00:00.000Z')
16 },
17 {
18 _id: ObjectId('573a1396f29313caabce4abe'),
19 title: 'The Great Northfield Minnesota Raid',
20 released: ISODate('1972-05-12T00:00:00.000Z')
21 },
22 {
23 _id: ObjectId('573a1396f29313caabce4ac4'),
24 title: 'The Heartbreak Kid',
25 released: ISODate('1973-02-01T00:00:00.000Z')
26 },
27 {
28 _id: ObjectId('573a1396f29313caabce4ac7'),
29 title: 'Gumshoe',
30 released: ISODate('1971-12-01T00:00:00.000Z')
31 },
32 {
33 _id: ObjectId('573a1396f29313caabce4ad9'),
34 title: 'Heat',
35 released: ISODate('1972-10-06T00:00:00.000Z')
36 },
37 {
38 _id: ObjectId('573a1396f29313caabce4ae7'),
39 title: 'Horror Express',
40 released: ISODate('1973-12-01T00:00:00.000Z')
41 }
42]

以下示例使用 range 运算符查询 sample_mflix.movies 集合中的字符串字段。对于本示例,您必须使用静态映射将集合中名为 title 的字段索引为 Atlas Search token 类型。

以下名为 default 的索引定义将 movies 集合中的 title 字段索引为 Atlas Search token 类型:

{
"mappings": {
"dynamic": false,
"fields": {
"title": {
"type": "token",
"normalizer": "lowercase"
}
}
}
}

以下查询搜索包含 citycountry 之间的字符的电影标题。它包括一个 $limit 阶段,用于将输出限制为 5 个结果,以及一个 $project 阶段,用于排除除 title 之外的所有字段。

1db.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])
[
{ title: 'Civilization' },
{ title: 'Clash of the Wolves' },
{ title: 'City Lights' },
{ title: 'Comradeship' },
{ title: 'Come and Get It' }
]

后退

queryString