范围
定义
语法
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 | no | |
lt or lte | BSON 日期、数字、字符串或 objectId | no | |
path | 字符串或字符串数组 | 要搜索的一个或多个带索引字段。请参阅路径构造。 | 是 |
score | 对象 | 修改分配给匹配搜索结果的分数。您可以使用以下选项修改默认分数:
当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。 有关在查询中使用 | no |
示例
以下示例使用示例数据的集合。如果您在集群上加载示例数据,则可以使用以下示例的索引定义创建索引,并在集群上运行示例查询。
提示
如果您已经加载示例数据集,请按照 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 ])
{ "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
阶段:
排除
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 ])
{ "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
集合中所有动态可索引字段(包括具有数值数组的字段)动态编制索引。 示例查询使用 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 ])
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
集合中的日期字段。对于本示例,您可以使用静态或动态映射为集合中名为 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 ])
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 ]
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 ])
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" } } } }
样本查询
以下查询搜索包含 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 ])
[ { title: 'Civilization' }, { title: 'Clash of the Wolves' }, { title: 'City Lights' }, { title: 'Comradeship' }, { title: 'Come and Get It' } ]