$rank (aggregation)
On this page本页内容
Definition定义
New in version 5.0. 5.0版新增。
$rank
Returns the document position (known as the rank) relative to other documents in the 返回文档相对于$setWindowFields stage partition.$setWindowFields阶段分区中其他文档的位置(称为排名)。
The $setWindowFields stage sortBy field value determines the document rank. $setWindowFields阶段sortBy字段值决定文档的级别。For more information on how MongoDB compares fields with different types, see BSON comparison order.有关MongoDB如何比较不同类型的字段的更多信息,请参阅BSON比较顺序。
If multiple documents occupy the same rank, 如果多个文档占用相同的排名,$rank places the document with the subsequent value at a rank with a gap (see Behavior).$rank会将具有后续值的文档放在有间隙的排名中(请参见行为)。
$rank is only available in the 仅在$setWindowFields stage.$setWindowFields阶段中可用。
$rank syntax:语法:
{ $rank: { } }
$rank does not accept any parameters.不接受任何参数。
See also: 另请参阅:
Behavior行为
$rank and $denseRank differ in how they rank duplicate sortBy field values. $rank和$denseRank对重复的sortBy字段值进行排名的方式不同。For example, with sortBy field values of 7, 9, 9, and 10:例如,如果sortBy字段值为7、9、9和10:
$denseRankranks the values as 1, 2, 2, and 3.将值排列为1、2、2和3。The duplicate 9 values have a rank of 2, and 10 has a rank of 3. There is no gap in the ranks.重复的9个值的排名为2,而10的排名为3。排名没有间隙。$rankranks the values as 1, 2, 2, and 4. The duplicate 9 values have a rank of 2, and 10 has a rank of 4.将值排列为1、2、2和4。重复的9个值的排名为2,而10的排名为4。There is a gap in the ranks for 3.排名有3位的差距。
Documents with a null value for a sortBy field or documents missing the sortBy field are assigned a rank based on the BSON comparison order.sortBy字段为null值的文档或缺少sortBy字段的文档将根据BSON比较顺序分配一个排名。
See the example in Rank Partitions Containing Duplicate Values, Nulls, or Missing Data.请参阅包含重复值、null或缺少数据的排名分区中的示例。
Examples实例
Create a 创建一个包含加利福尼亚州(cakeSales collection that contains cake sales in the states of California (CA) and Washington (WA):CA)和华盛顿州(WA)蛋糕销售的cakeSales集合:
db.cakeSales.insertMany( [
{ _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"),
state: "CA", price: 13, quantity: 120 },
{ _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"),
state: "WA", price: 14, quantity: 140 },
{ _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"),
state: "CA", price: 12, quantity: 145 },
{ _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"),
state: "WA", price: 13, quantity: 104 },
{ _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"),
state: "CA", price: 41, quantity: 162 },
{ _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"),
state: "WA", price: 43, quantity: 134 }
] )
Rank Partitions by an Integer Field按整数字段对分区进行排序
This example uses 本例使用$rank in the $setWindowFields stage to output the quantity rank of the cake sales for each state:$setWindowFields阶段中的$rank来输出每个州蛋糕销售的quantity排名:
db.cakeSales.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: { quantity: -1 },
output: {
rankQuantityForState: {
$rank: {}
}
}
}
}
] )
In the example:在示例中:
partitionBy: "$state"partitions the documents in the collection by按state.state对集合中的文档进行分区。There are partitions forCAandWA.CA和WA有分区。sortBy: { quantity: -1 }sorts the documents in each partition by按quantityin descending order (-1), so the highestquantityis first.quantity降序(-1)对每个分区中的文档进行排序,因此quantity最高的是第一个。
outputsets the使用rankQuantityForStatefield to thequantityrank using$rank, as shown in the following results.$rank将rankQuantityForState字段设置为quantity排名,如以下结果所示。
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
"state" : "CA", "price" : 41, "quantity" : 162, "rankQuantityForState" : 1 }
{ "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"),
"state" : "CA", "price" : 12, "quantity" : 145, "rankQuantityForState" : 2 }
{ "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"),
"state" : "CA", "price" : 13, "quantity" : 120, "rankQuantityForState" : 3 }
{ "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"),
"state" : "WA", "price" : 14, "quantity" : 140, "rankQuantityForState" : 1 }
{ "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"),
"state" : "WA", "price" : 43, "quantity" : 134, "rankQuantityForState" : 2 }
{ "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"),
"state" : "WA", "price" : 13, "quantity" : 104, "rankQuantityForState" : 3 }
Rank Partitions by a Date Field按日期字段排列分区
This example shows how to use dates with 此示例显示如何在$rank in the $setWindowFields stage to output the orderDate rank of the cake sales for each state:$setWindowFields阶段中使用带有$rank的日期来输出每个state蛋糕销售的orderDate排名:
db.cakeSales.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: { orderDate: 1 },
output: {
rankOrderDateForState: {
$rank: {}
}
}
}
}
] )
In the example:在示例中:
partitionBy: "$state"partitions the documents in the collection by按state.state对集合中的文档进行分区。There are partitions forCAandWA.CA和WA有分区。sortBy: { orderDate: 1 }sorts the documents in each partition by按orderDatein ascending order (1), so the earliestorderDateis first.orderDate按升序(1)对每个分区中的文档进行排序,因此最早的orderDate是第一个。
outputsets therankOrderDateForStatefield to theorderDaterank using$rank, as shown in the following results.output使用$rank将rankOrderDateForState字段设置为orderDate排名,如以下结果所示。
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
"state" : "CA", "price" : 41, "quantity" : 162, "rankOrderDateForState" : 1 }
{ "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"),
"state" : "CA", "price" : 13, "quantity" : 120, "rankOrderDateForState" : 2 }
{ "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"),
"state" : "CA", "price" : 12, "quantity" : 145, "rankOrderDateForState" : 3 }
{ "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"),
"state" : "WA", "price" : 43, "quantity" : 134, "rankOrderDateForState" : 1 }
{ "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"),
"state" : "WA", "price" : 13, "quantity" : 104, "rankOrderDateForState" : 2 }
{ "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"),
"state" : "WA", "price" : 14, "quantity" : 140, "rankOrderDateForState" : 3 }
Rank Partitions Containing Duplicate Values, Nulls, or Missing Data包含重复值、null或缺少数据的排名分区
Create a 创建cakeSalesWithDuplicates collection where:cakeSalesWithDuplicates集合,其中:
Cake sales are placed in the state of California (加利福尼亚州(CA) and Washington (WA).CA)和华盛顿州(WA)的蛋糕销售。Documents 6 to 8 have the same文档6至文档8具有与文档5相同的quantityandstateas document 5.quantity和state。Document 9 has the same文档9具有与文档4相同的quantityandstateas document 4.quantity和state。Document 10 has a文档10的nullquantity.quantity为null。Document 11 is missing the文件11缺少quantity.quantity。
db.cakeSalesWithDuplicates.insertMany( [
{ _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"),
state: "CA", price: 13, quantity: 120 },
{ _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"),
state: "WA", price: 14, quantity: 140 },
{ _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"),
state: "CA", price: 12, quantity: 145 },
{ _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"),
state: "WA", price: 13, quantity: 104 },
{ _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"),
state: "CA", price: 41, quantity: 162 },
{ _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"),
state: "WA", price: 43, quantity: 134 },
{ _id: 6, type: "strawberry", orderDate: new Date("2020-01-08T06:12:03Z"),
state: "WA", price: 41, quantity: 134 },
{ _id: 7, type: "strawberry", orderDate: new Date("2020-01-01T06:12:03Z"),
state: "WA", price: 34, quantity: 134 },
{ _id: 8, type: "strawberry", orderDate: new Date("2020-01-02T06:12:03Z"),
state: "WA", price: 40, quantity: 134 },
{ _id: 9, type: "strawberry", orderDate: new Date("2020-05-11T16:09:01Z"),
state: "CA", price: 39, quantity: 162 },
{ _id: 10, type: "strawberry", orderDate: new Date("2020-05-11T16:09:01Z"),
state: "CA", price: 39, quantity: null },
{ _id: 11, type: "strawberry", orderDate: new Date("2020-05-11T16:09:01Z"),
state: "CA", price: 39 }
] )
This example uses 本例使用$rank in the $setWindowFields stage to output the quantity rank from the cakeSalesWithDuplicates collection for each state:$setWindowFields阶段中的$rank从$setWindowFields集合中为每个state输出quantity排名:
db.cakeSalesWithDuplicates.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: { quantity: -1 },
output: {
rankQuantityForState: {
$rank: {}
}
}
}
}
] )
In the example:在示例中:
partitionBy: "$state"partitions the documents in the collection by按state.state对集合中的文档进行分区。There are partitions forCAandWA.CA和WA有分区。sortBy: { quantity: -1 }sorts the documents in each partition by按quantityin descending order (-1), so the highestquantityis first.quantity降序(-1)对每个分区中的文档进行排序,因此quantity最高的是第一个。
outputsets therankOrderDateForStatefield to thequantityrank using$rank.output使用$rank将rankOrderDateForState字段设置为quantity排名。
In the following example output:在以下输出示例中:
Documents with the samequantityandstatehave the same rank.quantity和state相同的文件具有相同的级别。If documents have the same rank, there is a gap between that rank and the next rank.如果文档具有相同的级别,则该级别与下一个级别之间存在差距。The document with thenullquantityand then the document with the missingquantityare ranked the lowest in the output for theCApartition.quantity为null的文档和quantity缺失的文档在CA分区的输出中排名最低。This sorting is the result of the BSON comparison order, which sorts这种排序是BSON比较顺序的结果,在本例中,它将nulland missing values after number values in this example.null值和缺失值排序在数值之后。
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
"state" : "CA", "price" : 41, "quantity" : 162, "rankQuantityForState" : 1 }
{ "_id" : 9, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"),
"state" : "CA", "price" : 39, "quantity" : 162, "rankQuantityForState" : 1 }
{ "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"),
"state" : "CA", "price" : 12, "quantity" : 145, "rankQuantityForState" : 3 }
{ "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"),
"state" : "CA", "price" : 13, "quantity" : 120, "rankQuantityForState" : 4 }
{ "_id" : 10, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"),
"state" : "CA", "price" : 39, "quantity" : null, "rankQuantityForState" : 5 }
{ "_id" : 11, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"),
"state" : "CA", "price" : 39, "rankQuantityForState" : 6 }
{ "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"),
"state" : "WA", "price" : 14, "quantity" : 140, "rankQuantityForState" : 1 }
{ "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"),
"state" : "WA", "price" : 43, "quantity" : 134, "rankQuantityForState" : 2 }
{ "_id" : 6, "type" : "strawberry", "orderDate" : ISODate("2020-01-08T06:12:03Z"),
"state" : "WA", "price" : 41, "quantity" : 134, "rankQuantityForState" : 2 }
{ "_id" : 7, "type" : "strawberry", "orderDate" : ISODate("2020-01-01T06:12:03Z"),
"state" : "WA", "price" : 34, "quantity" : 134, "rankQuantityForState" : 2 }
{ "_id" : 8, "type" : "strawberry", "orderDate" : ISODate("2020-01-02T06:12:03Z"),
"state" : "WA", "price" : 40, "quantity" : 134, "rankQuantityForState" : 2 }
{ "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"),
"state" : "WA", "price" : 13, "quantity" : 104, "rankQuantityForState" : 6 }