Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

db.collection.distinct()

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 选项
  • 行为
  • 示例

带驱动程序的 MongoDB

本页面提供 mongosh 方法的相关信息。要查看 MongoDB 驱动程序中的等效方法,请参阅编程语言的相应页面:

C#Java SyncNode.jsPyMongoC++GoJava RSKotlin CoroutineKotlin SyncPHPMongoidRustScala
db.collection.distinct(field, query, options)

查找单个集合或视图中指定字段的非重复值,并以数组形式返回结果。

此方法可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

注意

所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令

  • MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本

  • MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本

该方法采用以下参数:

Parameter
类型
说明

field

字符串

要针对该字段返回非重复值。

query

文档

指定要从中检索非重复值的文档的查询。

options

文档

注意

结果不得大于最大 BSON 大小。如果您的结果超出最大 BSON 大小,请使用聚合管道通过 $group 操作符检索非重复值,如使用聚合管道检索非重复值中所述。

下图是一个 db.collection.distinct() 调用示例。

带注释的不同操作图。
{ collation: <document> }
字段
类型
说明

collation

文档

可选。

指定用于操作的排序规则

排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。

排序规则选项的语法如下:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

指定排序规则时,locale 字段为必填字段;所有其他排序规则字段均为可选字段。有关字段的说明,请参阅排序规则文档

如果未指定排序规则,但集合具有默认排序规则(请参阅 db.createCollection()),则操作将使用为集合指定的排序规则。

如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。

您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。

分片集群中,distinct 命令可能会返回孤立文档

对于时间序列集合distinct 命令无法有效利用索引。相反,使用 $group 聚合按不同的值对文档进行分组。有关详细信息,请参阅时间序列限制。

如果指定的 field 值是数组,则 db.collection.distinct() 将数组的每个元素视为一个单独的值。

例如,如果某一字段的值为 [ 1, [1], 1 ],则 db.collection.distinct() 会将 1[1]1 视为不同的值。

有关示例,请参阅为数组字段返回不同值

在可能的情况下,db.collection.distinct() 操作可以使用索引。

索引还可以涵盖 db.collection.distinct() 操作。有关索引涵盖的查询的详细信息,请参阅涵盖的查询

如要在事务中执行不同的操作:

重要

在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。

有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项

从 MongoDB 4.2 开始,如果在操作完成之前,发出 db.collection.distinct() 的客户端断开连接,MongoDB 将使用killOpdb.collection.distinct() 标记为终止。

要在副本集成员上运行,distinct 操作需要成员处于 PRIMARYSECONDARY 状态。如果节点处于其他状态,如 STARTUP2,则操作错误。

8.0版本新增

您可以使用查询设置来设置索引提示、设置操作拒绝过滤器以及其他字段。这些设置将应用于整个集群上的查询结构。在关闭之后,集群将保留这些设置。

在查询规划期间,查询优化器将使用查询设置作为附加输入,这样会影响为运行查询而选择的计划。您还可以使用查询设置来阻塞查询结构。

要添加查询设置并探索示例,请参阅 setQuerySettings

您可以为 finddistinctaggregate 命令添加查询设置。

查询设置具有更多功能,相比已弃用的索引过滤器而言是您的首选。

要删除查询设置,请使用 removeQuerySettings。要获取查询设置,请在一个聚合管道中使用一个 $querySettings 阶段。

这些示例使用包含以下文档的 inventory 集合:

{ "_id": 1, "dept": "A", "item": { "sku": "111", "color": "red" }, "sizes": [ "S", "M" ] }
{ "_id": 2, "dept": "A", "item": { "sku": "111", "color": "blue" }, "sizes": [ "M", "L" ] }
{ "_id": 3, "dept": "B", "item": { "sku": "222", "color": "blue" }, "sizes": "S" }
{ "_id": 4, "dept": "A", "item": { "sku": "333", "color": "black" }, "sizes": [ "S" ] }

以下示例将返回 inventory 集合的所有文档中字段 dept 的不同值:

db.inventory.distinct( "dept" )

该方法返回以下不同 dept 值的数组:

[ "A", "B" ]

以下示例针对 inventory 集合的所有文档,从中返回嵌入 item 字段中的字段 sku 的非重复值:

db.inventory.distinct( "item.sku" )

该方法返回以下不同 sku 值的数组:

[ "111", "222", "333" ]

提示

另请参阅:

用于获取有关访问嵌入式文档内字段的信息的点符号

以下示例将返回 inventory 集合的所有文档中字段 sizes 的不同值:

db.inventory.distinct( "sizes" )

该方法返回以下不同 sizes 值的数组:

[ "M", "S", "L" ]

有关 distinct() 和数组字段的信息,请参阅行为一节。

对于 dept 等于 "A" 的文档,以下示例从中返回嵌入 item 字段中的字段 sku 的非重复值:

db.inventory.distinct( "item.sku", { dept: "A" } )

该方法返回以下不同 sku 值的数组:

[ "111", "333" ]

排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。

集合 myColl 包含以下文档:

{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

以下聚合操作包括排序规则选项:

db.myColl.distinct( "category", {}, { collation: { locale: "fr", strength: 1 } } )

有关排序规则字段的说明,请参阅排序规则文档

后退

db.collection.deleteOne