Definición
Nuevo en la versión 5.0.
Devuelve la posición del documento (conocida como rango) en relación con otros documentos en el $setWindowFields partición de etapa.
El valor $setWindowFields del campo sortBy de la etapa determina la clasificación del documento. Para más información sobre cómo MongoDB compara campos de diferentes tipos, consulte Orden de comparación BSON.
Si varios documentos ocupan el mismo rango, $denseRank coloca el documento con el valor subsiguiente en el siguiente rango sin espacios (ver Comportamiento).
$denseRank solo está disponible en la $setWindowFields etapa.
$denseRank sintaxis:
{ $denseRank: { } }
$denseRank no acepta ningún parámetro.
Tip
Comportamiento
$rank y difieren en $denseRank cómo clasifican los valores duplicados del campo sortBy. Por ejemplo, con los valores del campo 7 9sortBy,, 9 10y:
$denseRankClasifica los valores como 1, 2, 2 y 3. Los valores duplicados 9 tienen un rango de 2 y 10, un rango de 3. No hay brecha en los rangos.$rankClasifica los valores como 1, 2, 2 y 4. Los valores duplicados 9 tienen una clasificación de 2 y 10 de 4. Hay una brecha en la clasificación de 3.
A los documentos con un null valor para un campo sortBy o a los documentos que no tienen el campo sortBy se les asigna una clasificación basada en el orden de comparación BSON.
Consulte el ejemplo en Rango denso para valores duplicados, nulos y faltantes.
Ejemplos
Particiones de rango denso por un campo entero
Crea una colección de cakeSales que incluya ventas de pasteles en el estado de California (CA) y Washington (WA):
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 } ] )
Este ejemplo utiliza $denseRank en la etapa para generar $setWindowFields el quantity rango denso de las ventas de pasteles para state cada:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { quantity: -1 }, output: { denseRankQuantityForState: { $denseRank: {} } } } } ] )
En el ejemplo:
partitionBy: "$state"particiona los documentos de la colección enstate. Existen particiones paraCAyWA.sortBy: { quantity: -1 }ordena los documentos en cada partición porquantityen orden descendente-1(), por lo que el más altoquantityes el primero.
outputEstablece eldenseRankOrderDateForStatecampo en elorderDaterango denso usando, como se muestra en los siguientes$denseRankresultados.
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "denseRankQuantityForState" : 1 } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "denseRankQuantityForState" : 2 } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "denseRankQuantityForState" : 3 } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "denseRankQuantityForState" : 1 } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "denseRankQuantityForState" : 2 } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "denseRankQuantityForState" : 3 }
Particiones de rango denso por un campo de fecha
Este ejemplo muestra cómo utilizar fechas con $denseRank en la etapa para generar $setWindowFields el orderDate rango denso de las ventas de pasteles para state cada:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { denseRankOrderDateForState: { $denseRank: {} } } } } ] )
En el ejemplo:
partitionBy: "$state"particiona los documentos de la colección enstate. Existen particiones paraCAyWA.sortBy: { orderDate: 1 }ordena los documentos de cada partición pororderDateen orden ascendente (1), de modo que elorderDatemás antiguo sea el primero.
outputEstablece eldenseRankOrderDateForStatecampo en elorderDaterango usando, como se muestra en los siguientes$denseRankresultados.
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "denseRankOrderDateForState" : 1 } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "denseRankOrderDateForState" : 2 } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "denseRankOrderDateForState" : 3 } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "denseRankOrderDateForState" : 1 } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "denseRankOrderDateForState" : 2 } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "denseRankOrderDateForState" : 3 }
Clasificación densa para valores duplicados, nulos y faltantes
Crea una colección cakeSalesWithDuplicates donde:
Las ventas de pasteles se realizan en el estado de California (
CA) y Washington (WA).Los documentos 6 a 8 tienen los mismos
quantityystateque el documento 5.El documento 9 tiene el mismo
quantityystateque el documento 4.El documento 10 tiene un
nullquantity.Al documento 11 le falta el
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 } ] )
Este ejemplo utiliza $denseRank en la etapa $setWindowFields para obtener el quantity rango denso de la colección cakeSalesWithDuplicates para cada state:
db.cakeSalesWithDuplicates.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { quantity: -1 }, output: { denseRankQuantityForState: { $denseRank: {} } } } } ] )
En el ejemplo:
partitionBy: "$state"particiona los documentos de la colección enstate. Existen particiones paraCAyWA.sortBy: { quantity: -1 }ordena los documentos en cada partición porquantityen orden descendente-1(), por lo que el más altoquantityes el primero.
outputEstablece eldenseRankQuantityForStatecampo en elquantityrango denso$denseRankutilizando.
En el siguiente ejemplo de salida:
Los documentos con
quantitylosstatemismos valores y tienen el mismo rango y no hay diferencia entre ellos. Esto difiere de,$rankque sí tiene una diferencia entre ellos (para un ejemplo, consulte Particiones de rango que contienen valores duplicados, nulos o datos faltantes).El documento con el
nullquantityy, a continuación, el documento con el faltantequantityse clasifican en el último lugar en la salida de laCApartición. Esta ordenación es el resultado del orden de comparación BSON, que ordenanully los valores faltantes después de los valores numéricos en este ejemplo.
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "denseRankQuantityForState" : 1 } { "_id" : 9, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"), "state" : "CA", "price" : 39, "quantity" : 162, "denseRankQuantityForState" : 1 } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "denseRankQuantityForState" : 2 } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "denseRankQuantityForState" : 3 } { "_id" : 10, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"), "state" : "CA", "price" : 39, "quantity" : null, "denseRankQuantityForState" : 4 } { "_id" : 11, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"), "state" : "CA", "price" : 39, "denseRankQuantityForState" : 5 } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "denseRankQuantityForState" : 1 } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "denseRankQuantityForState" : 2 } { "_id" : 6, "type" : "strawberry", "orderDate" : ISODate("2020-01-08T06:12:03Z"), "state" : "WA", "price" : 41, "quantity" : 134, "denseRankQuantityForState" : 2 } { "_id" : 7, "type" : "strawberry", "orderDate" : ISODate("2020-01-01T06:12:03Z"), "state" : "WA", "price" : 34, "quantity" : 134, "denseRankQuantityForState" : 2 } { "_id" : 8, "type" : "strawberry", "orderDate" : ISODate("2020-01-02T06:12:03Z"), "state" : "WA", "price" : 40, "quantity" : 134, "denseRankQuantityForState" : 2 } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "denseRankQuantityForState" : 3 }