Docs 菜单

Docs 主页开发应用程序MongoDB Manual

distinct

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 行为
  • 举例
distinct

查找单个集合中指定字段的非重复值。 distinct会返回一份包含不同值数组的文档。返回文档还包含一个嵌入式文档,其中包含查询统计信息和查询计划。

提示

mongosh中,该命令也可以通过db.collection.distinct()辅助方法运行。

助手方法对于mongosh用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。

此命令可用于以下环境中托管的部署:

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

注意

此命令在 M 0 、 M 2和 M 5集群中提供有限支持。有关更多信息,请参阅不支持的命令。

该命令具有以下语法:

db.runCommand(
{
distinct: "<collection>",
key: "<field>",
query: <query>,
readConcern: <read concern document>,
collation: <collation document>,
comment: <any>,
hint: <string or document>
}
)

该命令接受以下字段:

字段
类型
说明
distinct
字符串
要查询不同值的集合名称。
key
字符串
要针对该字段返回非重复值。
query
文档
可选。指定要从中检索非重复值的文档的查询。
readConcern
文档

可选。指定读关注

从 MongoDB 3.6 开始,readConcern 选项具有以下事务语法: readConcern: { level: <value> }

可能的读关注级别是:

有关读关注级别的更多信息,请参阅读关注级别

collation
文档

可选。

指定用于操作的排序规则

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

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

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

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

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

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

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

comment
注意到

可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:

注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。

hint
字符串或文档

可选。以字符串或文档形式指定索引名称。如果指定,查询规划器只考虑使用提示索引的计划。有关更多详细信息,请参阅指定索引。

版本 7.1 中的新增内容

注意

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

MongoDB 还为 命令提供 shell 包装器方法db.collection.distinct() distinct。此外,许多 MongoDB 驱动程序 都提供包装器方法。请参阅特定的驱动程序文档。

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

如果指定的field值是数组,则distinct将数组的每个元素视为单独的值。

例如,如果字段的值为[ 1, [1], 1 ] ,则distinct1[1]1视为单独的值。

从 MongoDB 6开始。 0 ,使用数组时, distinct命令会为集合和视图返回相同的结果。

示例请参见:

如果可能, distinct操作可以使用索引。

索引还可以涵盖distinct操作。有关索引涵盖的查询的更多信息,请参阅涵盖的查询。

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

重要

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

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

从 MongoDB4 开始。2 ,如果发出 的客户端在操作完成之前断开连接,MongoDBdistinct 会使用distinct killOp将 标记为终止。

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

从 MongoDB 6.0 开始,索引筛选器会使用之前使用 planCacheSetFilter 命令设置的排序规则

这些示例使用包含以下文档的 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.runCommand ( { distinct: "inventory", key: "dept" } )

该命令返回一个文档,其中包含名为values的字段,其中包含不同的 dept 值:

{
"values" : [ "A", "B" ],
"ok" : 1
}

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

db.runCommand ( { distinct: "inventory", key: "item.sku" } )

该命令返回一个文档,其中包含名为values的字段,其中包含不同的 sku 值:

{
"values" : [ "111", "222", "333" ],
"ok" : 1
}

提示

另请参阅:

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

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

db.runCommand ( { distinct: "inventory", key: "sizes" } )

该命令返回一个文档,其中包含名为values的字段,其中包含不同的 sizes 值:

{
"values" : [ "M", "S", "L" ],
"ok" : 1
}

有关distinct和数组字段的信息,请参阅“行为”部分。

从 MongoDB 6开始。 0 ,使用数组时, distinct命令会为集合和视图返回相同的结果。

以下示例创建一个名为 sensor 的集合,其中包含每个文档的温度值数组:

db.sensor.insertMany( [
{ _id: 0, temperatures: [ { value: 1 }, { value: 4 } ] },
{ _id: 1, temperatures: [ { value: 2 }, { value: 8 } ] },
{ _id: 2, temperatures: [ { value: 3 }, { value: 12 } ] },
{ _id: 3, temperatures: [ { value: 1 }, { value: 4 } ] }
] )

以下示例从 sensor 集合创建一个名为 sensorView 的视图:

db.createView( "sensorView", "sensor", [] )

以下示例使用distinct返回sensor集合中temperatures数组的唯一值:

db.sensor.distinct( "temperatures.1.value" )

temperatures.1.value 中的 1 指定 temperatures 数组索引。

示例输出:

[ 4, 8, 12 ]

sensorView 的示例:

db.sensorView.distinct( "temperatures.1.value" )

示例输出:

  • [ 4, 8, 12 ] 从 MongoDB 6.0 开始(与从 sensor 集合返回的结果相同)。

  • [] 在 MongoDB 6.0 以前的版本中。

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

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

该命令返回一个文档,其中包含名为values的字段,其中包含不同的 sku 值:

{
"values" : [ "111", "333" ],
"ok" : 1
}

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

集合 myColl 包含以下文档:

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

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

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

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

若要覆盖 "local" 的默认读取关注级别,请使用 readConcern 选项。

对副本集执行以下操作可以指定读关注 "majority",以读取确认已写入大多数节点的数据的最新副本。

注意

无论读关注级别如何,节点上的最新数据可能无法反映系统中数据的最新版本。

db.runCommand(
{
distinct: "restaurants",
key: "rating",
query: { cuisine: "italian" },
readConcern: { level: "majority" }
}
)

为确保单个线程可以读取自己的写入内容,请对副本集的主节点使用 "majority" 读关注和 "majority" 写关注。

您可以使用提示选项指定索引名称或模式。

要根据索引名称指定提示,请执行以下操作:

db.runCommand ( { distinct: "inventory", key: "dept", hint: "sizes" } )

要指定基于索引模式的提示,请执行以下操作:

db.runCommand ( { distinct: "inventory", key: "dept", hint: { sizes: 1 } } )
← 数数