等于
定义
语法
equals
通过以下语法实现:
{ $search: { "index": <index name>, // optional, defaults to "default" "equals": { "path": "<field-to-search>", "value": <boolean-value>|<objectId>|<number>|<date>|<string>, "score": <score-options> } } }
选项
equals
使用以下词条来构造查询:
评分行为
默认情况下,equals
使用 constant
评分。每个匹配文档的得分为 1
。
当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。
有关评分示例,请参阅示例部分。
示例
样本集合
本页上的示例使用名为 users
的集合,其中包含以下三个文档:
注意
以下示例使用JavaScript格式。 您可以使用mongosh
以这种格式添加这些文档。 Atlas 用户界面需要 JSON格式。
db.users.insertMany([ { "_id" : ObjectId("5ed698faa1199b471010d70c"), "name" : "Jim Hall", "verified_user" : true, "account" : { "new_user" : true, "active_user" : true }, "teammates" : [ ObjectId("5ed6990aa1199b471010d70d"), ObjectId("59b99dbdcfa9a34dcd7885c8") ], "region" : "East", "account_created" : ISODate("2021-12-12T10:18:27.000+00:00"), "employee_number" : 257, "uuid" : UUID("fac32260-b511-4c69-8485-a2be5b7dda9e"), "job_title": "engineer" }, { "_id" : ObjectId("5ed6990aa1199b471010d70d"), "name" : "Ellen Smith", "verified_user" : true, "account" : { "new_user" : false, "active_user" : true }, "teammates" : [ ObjectId("5a9427648b0beebeb69537a5"), ObjectId("59b99dbdcfa9a34dcd7881d1") ], "region" : "Southwest", "account_created" : ISODate("2022-05-04T05:01:08.000+00:00"), "employee_number" : 258, "job_title": null }, { "_id" : ObjectId("5ed6994fa1199b471010d70e"), "name" : "Fred Osgood", "verified_user" : false, "account" : { "new_user" : false, "active_user" : false }, "teammates" : [ ObjectId("5a9427648b0beebeb69589a1"), ObjectId("59b99dbdcfa9a34dcd7897d3") ], "region" : "Northwest", "account_created" : ISODate("2022-01-19T08:22:15.000+00:00"), "employee_number" : 259, "job_title": null } ])
{ "_id" : ObjectId("5ed698faa1199b471010d70c"), "name" : "Jim Hall", "verified_user" : true, "account" : { "new_user" : true, "active_user" : true }, "teammates" : [ ObjectId("5ed6990aa1199b471010d70d"), ObjectId("59b99dbdcfa9a34dcd7885c8") ], "region" : "East", "account_created" : ISODate("2021-12-12T10:18:27.000+00:00"), "employee_number" : 257, "uuid" : UUID("fac32260-b511-4c69-8485-a2be5b7dda9e"), "job_title": "engineer" }
{ "_id" : ObjectId("5ed6990aa1199b471010d70d"), "name" : "Ellen Smith", "verified_user" : true, "account" : { "new_user" : false, "active_user" : true }, "teammates" : [ ObjectId("5a9427648b0beebeb69537a5"), ObjectId("59b99dbdcfa9a34dcd7881d1") ], "region" : "Southwest", "account_created" : ISODate("2022-05-04T05:01:08.000+00:00"), "employee_number" : 258, "job_title": null }
{ "_id" : ObjectId("5ed6994fa1199b471010d70e"), "name" : "Fred Osgood", "verified_user" : false, "account" : { "new_user" : false, "active_user" : false }, "teammates" : [ ObjectId("5a9427648b0beebeb69589a1"), ObjectId("59b99dbdcfa9a34dcd7897d3") ], "region" : "Northwest", "account_created" : ISODate("2022-01-19T08:22:15.000+00:00"), "employee_number" : 259, "job_title": null }
样本索引
users
集合使用以下索引定义进行索引:
{ "mappings": { "dynamic": true, "fields": { "name": { "type": "token", "normalizer": "lowercase" } } } }
该索引定义指定以下内容:
自动对所有可动态索引的字段进行索引。
将
name
字段作为token
类型进行索引,以支持使用equals
操作符搜索字符串。
要了解如何创建 Atlas Search 索引,请参阅创建 Atlas Search 索引。
基本查询示例
布尔值示例
以下示例使用 equals
操作符在 users
集合中搜索 verified_user
字段设置为 true
的文档。
db.users.aggregate([ { "$search": { "equals": { "path": "verified_user", "value": true } } }, { "$project": { "name": 1, "_id": 0, "score": { "$meta": "searchScore" } } } ])
以上查询返回以下结果:
{ "name" : "Jim Hall", "score" : 1 } { "name" : "Ellen Smith", "score" : 1 }
“Jim Hall”和“Ellen Smith”的文档得分均为 1
,因为这些文档将 verified_user
字段设置为 true
。
以下示例使用 equals
操作符在 users
集合中搜索包含布尔值 true
的 account.new_user
字段的文档。
db.users.aggregate([ { "$search": { "equals": { "path": "account.new_user", "value": true } } } ])
前面的查询返回“Jim Hall”的文档,因为该文档在 account
对象中包含 "new_user": true
。
ObjectId 示例
以下示例使用 equals
操作符在 users
集合中搜索 teammates
字段包含 ObjectId("5a9427648b0beebeb69589a1")
值的文档。
db.users.aggregate([ { "$search": { "equals": { "path": "teammates", "value": ObjectId("5a9427648b0beebeb69589a1") } } } ])
前面的查询返回“Fred Osgood”的文档,因为该文档在 teammates
数组中包含 ObjectId("5a9427648b0beebeb69589a1")
。
日期示例
以下示例使用 equals
操作符在 users
集合中搜索 account_created
字段包含与 ISODate("2022-05-04T05:01:08.000+00:00")
匹配的值的文档。
db.users.aggregate([ { "$search": { "equals": { "path": "account_created", "value": ISODate("2022-05-04T05:01:08.000+00:00") } } } ])
前面的查询返回“Ellen Smith”的文档,因为该文档包含 "account_created":
2022-05-04T05:01:08.000+00:00
。
数字示例
以下示例使用 equals
操作符在 users
集合中搜索 employee_number
字段包含与 259
匹配的值的文档。
db.users.aggregate([ { "$search": { "equals": { "path": "employee_number", "value": 259 } } } ])
前面的查询会为 "Fred Osgood" 返回文档,因为该文档包含 "employee_number":
259
。
字符串示例
以下示例使用 equals
操作符在 users
集合中搜索 name
字段包含与 Jim Hall
匹配的值的文档。
db.users.aggregate([ { "$search": { "equals": { "path": "name", "value": "jim hall" } } } ])
前面的查询返回“Jim Hall”的文档,因为该文档在 name
字段中包含 Jim Hall
。Atlas Search 将小写查询与文档中的大写值进行匹配,因为它将词语规范化为小写,如 name
字段的索引定义中指定的一样。
UUID 示例
以下示例使用 equals
操作符在 users
集合中搜索 uuid
字段包含与特定 UUID 匹配的值的文档。
db.users.aggregate([ { "$search": { "equals": { "path": "uuid", "value": UUID("fac32260-b511-4c69-8485-a2be5b7dda9e") } } } ])
前面的查询返回“Jim Hall”的文档,因为该文档在 uuid
字段中包含指定的 UUID。
空示例
以下示例使用 equals
操作符在 users
集合中搜索 job_title
字段包含 null 值的文档。
db.users.aggregate([ { $search: { "equals": { "path": "job_title", "value": null } } } ])
前面的查询会返回"Ellen Smith" 和 Fred Osgood
的文档,因为该文档的 job_title
字段中包含空值。
复合示例查询
以下示例将 compound 操作符与 must
、mustNot
和 equals
结合使用,以搜索 region
字段为 Southwest
并且 verified_user
字段不是 false
的文档。
db.users.aggregate([ { "$search": { "compound": { "must": { "text": { "path": "region", "query": "Southwest" } }, "mustNot": { "equals": { "path": "verified_user", "value": false } } } } } ])
上面的查询返回“Ellen Smith”的文档,这是集合中唯一满足搜索条件的文档。
下面的示例查询具有以下搜索条件:
verified_user
字段必须设置为true
必须满足以下条件之一:
teammates
数组包含ObjectId("5ed6990aa1199b471010d70d")
值region
字段设置为Northwest
db.users.aggregate([ { "$search": { "compound": { "must": { "equals": { "path": "verified_user", "value": true } }, "should": [ { "equals": { "path": "teammates", "value": ObjectId("5ed6990aa1199b471010d70d") } }, { "text": { "path": "region", "query": "Northwest" } } ], "minimumShouldMatch": 1 } } }, { "$project": { "name": 1, "_id": 0, "score": { "$meta": "searchScore" } } } ])
以上查询返回以下结果:
{ "name" : "Jim Hall", "score" : 2 }
“Jim Hall”的文档得分为 2
,因为它满足 must
子句以及两个 should
子句中的第一个子句的要求。
您可以使用复合查询搜索多个 ObjectID。以下示例查询使用 compound
操作符和 should
子句搜索三个不同的 ObjectID,其中的至少两个 ObjectID 必须满足查询条件。
db.users.aggregate([ { "$search": { "compound": { "should": [ { "equals": { "path": "teammates", "value": ObjectId("5a9427648b0beebeb69537a5") } }, { "equals": { "path": "teammates", "value": ObjectId("59b99dbdcfa9a34dcd7881d1") } }, { "equals": { "path": "teammates", "value": ObjectId("5a9427648b0beebeb69579d0") } } ], "minimumShouldMatch": 2 } } }, { "$project": { "name": 1, "_id": 0, "score": { "$meta": "searchScore" } } } ])
以上查询返回以下结果:
{ "name" : "Ellen Smith", "score" : 2 }
“Ellen Smith”的文档得分为 2
,因为它在 teammates
数组中包含两个指定的 ObjectID。