View a markdown version of this page

percentil $ - Amazon DocumentDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

percentil $

Nuevo a partir de la versión 8.0.1.

El $percentile operador de Amazon DocumentDB calcula los valores percentiles especificados para los datos numéricos. Como acumulador, calcula los valores percentiles de los documentos de un grupo en fase de proceso de agregación. $group Como expresión, calcula los percentiles de una matriz de números.

Parámetros

  • input: expresión que se resuelve en un valor numérico o en una matriz de valores numéricos.

  • p: una matriz de valores de percentiles entre 0 y 1, donde cada valor representa un percentil que se debe calcular. Por ejemplo, [0.25, 0.5, 0.75] calcula los percentiles 25, 50 y 75.

  • method: cadena que especifica el método de cálculo. En la actualidad, solo se admite "approximate".

Comportamiento

El "approximate" método utiliza el algoritmo t-digest para calcular métricas aproximadas basadas en percentiles. Con conjuntos de datos pequeños, distintos valores de percentiles pueden dar como resultado el mismo resultado. Por ejemplo, con solo 5 valores por grupo, p90 y p99 pueden devolver el valor máximo del grupo. La precisión mejora a medida que aumenta el número de puntos de datos.

Ejemplo (MongoDB Shell)

El siguiente ejemplo muestra cómo usar el $percentile operador para calcular los percentiles 25 y 75 de las puntuaciones de cada clase.

Cree documentos de muestra

db.students.insertMany([ { class: "A", score: 72 }, { class: "A", score: 85 }, { class: "A", score: 90 }, { class: "A", score: 68 }, { class: "A", score: 95 }, { class: "B", score: 80 }, { class: "B", score: 75 }, { class: "B", score: 92 }, { class: "B", score: 88 }, { class: "B", score: 70 } ]);

Ejemplo de consulta

db.students.aggregate([ { $group: { _id: "$class", percentiles: { $percentile: { input: "$score", p: [0.25, 0.75], method: "approximate" } } }} ]);

Salida

[ { "_id": "A", "percentiles": [72, 90] }, { "_id": "B", "percentiles": [75, 88] } ]

Ejemplo de uso de expresiones (MongoDB Shell)

El $percentile operador también se puede usar como expresión dentro de una $project etapa para calcular los percentiles de un campo de matriz.

Cree documentos de muestra

db.surveys.insertMany([ { _id: 1, responses: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] }, { _id: 2, responses: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] } ]);

Ejemplo de consulta

db.surveys.aggregate([ { $project: { quartiles: { $percentile: { input: "$responses", p: [0.25, 0.5, 0.75], method: "approximate" } } }} ]);

Salida

[ { "_id": 1, "quartiles": [6, 10, 16] }, { "_id": 2, "quartiles": [5, 9, 15] } ]

Ejemplo de uso de un operador de ventana (MongoDB Shell)

Nuevo a partir de la versión 8.0.2.

El $percentile operador también se puede utilizar como operador de ventanas en el $setWindowFields escenario. En este contexto, calcula los valores percentiles especificados para los documentos de cada ventana. Especifique el operador en el output campo y, si lo desea, defina los límites de la ventana con un documento. window

nota

Cuando se usa como operador de ventana en$setWindowFields, $percentile está limitado a 100 MB de datos intermedios. Una operación que supera este límite devuelve un error.

Crea documentos de muestra

db.sensorData.insertMany([ { _id: 1, sensor: "A", reading: 72 }, { _id: 2, sensor: "A", reading: 85 }, { _id: 3, sensor: "A", reading: 90 }, { _id: 4, sensor: "A", reading: 68 }, { _id: 5, sensor: "A", reading: 95 }, { _id: 6, sensor: "B", reading: 80 }, { _id: 7, sensor: "B", reading: 75 }, { _id: 8, sensor: "B", reading: 92 }, { _id: 9, sensor: "B", reading: 88 }, { _id: 10, sensor: "B", reading: 70 } ]);

Ejemplo de consulta

El siguiente ejemplo divide los documentos sensor y calcula los percentiles 25 y 75 de reading todos los documentos de cada partición.

db.sensorData.aggregate([ { $setWindowFields: { partitionBy: "$sensor", output: { readingPercentiles: { $percentile: { input: "$reading", p: [0.25, 0.75], method: "approximate" }, window: { documents: ["unbounded", "unbounded"] } } } } } ]);

Salida

[ { "_id": 1, "sensor": "A", "reading": 72, "readingPercentiles": [72, 90] }, { "_id": 2, "sensor": "A", "reading": 85, "readingPercentiles": [72, 90] }, { "_id": 3, "sensor": "A", "reading": 90, "readingPercentiles": [72, 90] }, { "_id": 4, "sensor": "A", "reading": 68, "readingPercentiles": [72, 90] }, { "_id": 5, "sensor": "A", "reading": 95, "readingPercentiles": [72, 90] }, { "_id": 6, "sensor": "B", "reading": 80, "readingPercentiles": [75, 88] }, { "_id": 7, "sensor": "B", "reading": 75, "readingPercentiles": [75, 88] }, { "_id": 8, "sensor": "B", "reading": 92, "readingPercentiles": [75, 88] }, { "_id": 9, "sensor": "B", "reading": 88, "readingPercentiles": [75, 88] }, { "_id": 10, "sensor": "B", "reading": 70, "readingPercentiles": [75, 88] } ]

Cada documento se complementa con readingPercentiles los percentiles 25 y 75 aproximados de todos los documentos de reading su partición.

Ejemplos de código

Para ver un ejemplo de código sobre el uso del $percentile operador, seleccione la pestaña correspondiente al idioma que desee utilizar. Los siguientes ejemplos muestran el uso del acumulador (in$group), el uso de expresiones (in$project) y el uso del operador de ventana (in$setWindowFields):

Node.js
const { MongoClient } = require('mongodb'); async function example() { const uri = 'mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'; const client = new MongoClient(uri); try { await client.connect(); const db = client.db('test'); // Accumulator usage: percentiles across grouped documents const students = db.collection('students'); await students.insertMany([ { class: "A", score: 72 }, { class: "A", score: 85 }, { class: "A", score: 90 }, { class: "A", score: 68 }, { class: "A", score: 95 }, { class: "B", score: 80 }, { class: "B", score: 75 }, { class: "B", score: 92 }, { class: "B", score: 88 }, { class: "B", score: 70 } ]); const accumulatorResult = await students.aggregate([ { $group: { _id: "$class", percentiles: { $percentile: { input: "$score", p: [0.25, 0.75], method: "approximate" } } }} ]).toArray(); console.log('Accumulator result:', accumulatorResult); // Expression usage: percentiles of an array field const surveys = db.collection('surveys'); await surveys.insertMany([ { _id: 1, responses: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] }, { _id: 2, responses: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] } ]); const expressionResult = await surveys.aggregate([ { $project: { quartiles: { $percentile: { input: "$responses", p: [0.25, 0.5, 0.75], method: "approximate" } } }} ]).toArray(); console.log('Expression result:', expressionResult); // Window operator usage: percentiles across each partition const sensorData = db.collection('sensorData'); await sensorData.insertMany([ { _id: 1, sensor: "A", reading: 72 }, { _id: 2, sensor: "A", reading: 85 }, { _id: 3, sensor: "A", reading: 90 }, { _id: 4, sensor: "A", reading: 68 }, { _id: 5, sensor: "A", reading: 95 }, { _id: 6, sensor: "B", reading: 80 }, { _id: 7, sensor: "B", reading: 75 }, { _id: 8, sensor: "B", reading: 92 }, { _id: 9, sensor: "B", reading: 88 }, { _id: 10, sensor: "B", reading: 70 } ]); const windowResult = await sensorData.aggregate([ { $setWindowFields: { partitionBy: "$sensor", output: { readingPercentiles: { $percentile: { input: "$reading", p: [0.25, 0.75], method: "approximate" }, window: { documents: ["unbounded", "unbounded"] } } } } } ]).toArray(); console.log('Window result:', windowResult); } finally { await client.close(); } } example();
Python
from pymongo import MongoClient def example(): client = MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') try: db = client['test'] # Accumulator usage: percentiles across grouped documents students = db['students'] students.insert_many([ { 'class': 'A', 'score': 72 }, { 'class': 'A', 'score': 85 }, { 'class': 'A', 'score': 90 }, { 'class': 'A', 'score': 68 }, { 'class': 'A', 'score': 95 }, { 'class': 'B', 'score': 80 }, { 'class': 'B', 'score': 75 }, { 'class': 'B', 'score': 92 }, { 'class': 'B', 'score': 88 }, { 'class': 'B', 'score': 70 } ]) accumulator_result = list(students.aggregate([ { '$group': { '_id': '$class', 'percentiles': { '$percentile': { 'input': '$score', 'p': [0.25, 0.75], 'method': 'approximate' } } }} ])) print('Accumulator result:', accumulator_result) # Expression usage: percentiles of an array field surveys = db['surveys'] surveys.insert_many([ { '_id': 1, 'responses': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] }, { '_id': 2, 'responses': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] } ]) expression_result = list(surveys.aggregate([ { '$project': { 'quartiles': { '$percentile': { 'input': '$responses', 'p': [0.25, 0.5, 0.75], 'method': 'approximate' } } }} ])) print('Expression result:', expression_result) # Window operator usage: percentiles across each partition sensor_data = db['sensorData'] sensor_data.insert_many([ { '_id': 1, 'sensor': 'A', 'reading': 72 }, { '_id': 2, 'sensor': 'A', 'reading': 85 }, { '_id': 3, 'sensor': 'A', 'reading': 90 }, { '_id': 4, 'sensor': 'A', 'reading': 68 }, { '_id': 5, 'sensor': 'A', 'reading': 95 }, { '_id': 6, 'sensor': 'B', 'reading': 80 }, { '_id': 7, 'sensor': 'B', 'reading': 75 }, { '_id': 8, 'sensor': 'B', 'reading': 92 }, { '_id': 9, 'sensor': 'B', 'reading': 88 }, { '_id': 10, 'sensor': 'B', 'reading': 70 } ]) window_result = list(sensor_data.aggregate([ { '$setWindowFields': { 'partitionBy': '$sensor', 'output': { 'readingPercentiles': { '$percentile': { 'input': '$reading', 'p': [0.25, 0.75], 'method': 'approximate' }, 'window': { 'documents': ['unbounded', 'unbounded'] } } } } } ])) print('Window result:', window_result) finally: client.close() example()