On this page
distinct
在本页面
Definition
distinct
- 在单个集合中查找指定字段的不同值。 distinct返回包含不同值数组的文档。返回文档还包含带有查询统计信息和查询计划的嵌入式文档。
该命令采用以下形式
{
distinct: "<collection>",
key: "<field>",
query: <query>,
readConcern: <read concern document>,
collation: <collation document>
}
该命令包含以下字段:
Field | Type | Description |
---|---|---|
distinct |
string | 要查询不同值的集合的名称。 |
key |
string | 要为其返回不同值的字段。 |
query |
document | 可选的。一个查询,指定要从中检索不同值的文档。 |
readConcern |
document | 可选的。指定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 ]
,则distinct将1
,[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
- 要使用read concern级别"majority",副本集必须使用WiredTiger 存储引擎和选举协议版本 1。
从 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"写入关注。