distinct

在本页面

Definition

  • distinct
    • 在单个集合中查找指定字段的不同值。 distinct返回包含不同值数组的文档。返回文档还包含带有查询统计信息和查询计划的嵌入式文档。

该命令采用以下形式

{
  distinct: "<collection>",
  key: "<field>",
  query: <query>,
  readConcern: <read concern document>,
  collation: <collation document>
}

该命令包含以下字段:

FieldTypeDescription
distinctstring要查询不同值的集合的名称。
keystring要为其返回不同值的字段。
querydocument可选的。一个查询,指定要从中检索不同值的文档。
readConcerndocument可选的。指定read concern


readConcern 选项具有以下语法:
在版本 3.6 中更改。
readConcern: { level: <value> }
可能的阅读关注级别为:
"local"。这是默认的阅读关注级别。
"available"。当未指定读取操作和因果一致的会话和“ level”时,这是针对次要对象的读取的默认值。查询返回实例的最新数据。
"majority"。可用于使用WiredTiger 存储引擎的副本集。
"linearizable"。仅可用于primary上的读取操作。
有关阅读关注级别的更多信息,请参阅阅读关注级别
对于"local"(默认)或"majority"读关注级别,您可以指定afterClusterTime选项以使读操作返回满足级别要求和在群集时间之后指定的数据。有关更多信息,请参见读取操作和因果一致的会话
| collation |文档|可选。
指定用于操作的collation
Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
排序规则选项具有以下语法:
collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
指定排序规则时,locale字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见Collation Document
如果未指定排序规则,但是集合具有默认排序规则(请参见db.createCollection()),则该操作将使用为集合指定的排序规则。
如果没有为集合或操作指定排序规则,则 MongoDB 使用先前版本中使用的简单二进制比较进行字符串比较。
您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。
3.4 版中的新功能。

Note

结果不得大于最大值BSON size。如果结果超过最大 BSON 大小,请使用聚合管道使用$group运算符检索不同的值,如使用汇总管道检索不同的值中所述。

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

Behavior

sharded cluster中,distinct命令可以返回orphaned documents

Array Fields

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

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

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

Index Use

distinct操作可以使用索引。

索引也可以cover distinct个操作。有关由索引覆盖的查询的更多信息,请参见Covered Query

Examples

这些示例使用的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
}

See also

Dot Notation有关访问嵌入式文档中的字段的信息

返回数组字段的不同值

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

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

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

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

有关distinct和数组字段的信息,请参见Behavior部分。

以不同的方式指定查询

下面的示例从dept等于"A"的文档中返回嵌入在item字段中的字段sku的不同值:

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

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

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

指定排序规则

3.4 版的新功能。

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

集合myColl具有以下文档:

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

以下聚合操作包括Collation选项:

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

有关整理字段的说明,请参见Collation Document

覆盖默认读取问题

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

对副本集的以下操作指定Read Concern"majority"来读取已确认已写入大多数节点的数据的最新副本。

Note

从 MongoDB 3.6 开始,默认情况下启用对读取关注"majority"的支持。对于 MongoDB 3.6.1-3.6.x,您可以禁用阅读关注"majority"。有关更多信息,请参见禁用多数阅读关注

  • 无论read concern级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本。
db.runCommand(
   {
     distinct: "restaurants",
     key: "rating",
     query: { cuisine: "italian" },
     readConcern: { level: "majority" }
   }
)

为确保单个线程可以读取其自己的写入,请对副本集的主数据库使用"majority"读取关注和"majority"写入关注。