View a markdown version of this page

$ mediana - 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.

$ mediana

Nuevo a partir de la versión 8.0.1.

El $median operador de Amazon DocumentDB calcula la mediana del valor de los datos numéricos. Como acumulador, calcula la mediana de los valores numéricos de los documentos de un grupo en fase de proceso de agregación. $group Como expresión, calcula la mediana 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.

  • method: cadena que especifica el método de cálculo. Actualmente solo "approximate" es compatible, que utiliza el algoritmo t-digest.

Comportamiento

El "approximate" método usa el algoritmo t-digest para calcular una mediana aproximada. El resultado es un valor existente del conjunto de datos en lugar de una interpolación entre valores. La precisión mejora a medida que aumenta la cantidad de puntos de datos.

Ejemplo (MongoDB Shell)

El siguiente ejemplo muestra cómo usar el $median operador para calcular la puntuación media de una prueba por 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", medianScore: { $median: { input: "$score", method: "approximate" } } }} ]);

Salida

[ { "_id": "A", "medianScore": 85 }, { "_id": "B", "medianScore": 80 } ]

Ejemplo de uso de expresiones (MongoDB Shell)

El $median operador también se puede usar como expresión dentro de una $project etapa para calcular la mediana de un campo de matriz.

Cree documentos de muestra

db.surveys.insertMany([ { _id: 1, ratings: [3, 5, 7, 9, 2] }, { _id: 2, ratings: [10, 20, 30, 40, 50] }, { _id: 3, ratings: [1, 1, 2, 3, 5] } ]);

Ejemplo de consulta

db.surveys.aggregate([ { $project: { medianRating: { $median: { input: "$ratings", method: "approximate" } } }} ]);

Salida

[ { "_id": 1, "medianRating": 5 }, { "_id": 2, "medianRating": 30 }, { "_id": 3, "medianRating": 2 } ]

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

Nuevo a partir de la versión 8.0.2.

El $median operador también se puede utilizar como operador de ventanas en el $setWindowFields escenario. En este contexto, calcula la mediana de los valores numéricos de 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 window documento.

nota

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

Crea documentos de muestra

db.temperatures.insertMany([ { _id: 1, city: "A", reading: 60 }, { _id: 2, city: "A", reading: 65 }, { _id: 3, city: "A", reading: 70 }, { _id: 4, city: "B", reading: 80 }, { _id: 5, city: "B", reading: 85 }, { _id: 6, city: "B", reading: 90 } ]);

Ejemplo de consulta

El siguiente ejemplo divide los documentos city y calcula la mediana de reading todos los documentos de cada partición.

db.temperatures.aggregate([ { $setWindowFields: { partitionBy: "$city", output: { medianReading: { $median: { input: "$reading", method: "approximate" }, window: { documents: ["unbounded", "unbounded"] } } } } } ]);

Salida

[ { "_id": 1, "city": "A", "reading": 60, "medianReading": 65 }, { "_id": 2, "city": "A", "reading": 65, "medianReading": 65 }, { "_id": 3, "city": "A", "reading": 70, "medianReading": 65 }, { "_id": 4, "city": "B", "reading": 80, "medianReading": 85 }, { "_id": 5, "city": "B", "reading": 85, "medianReading": 85 }, { "_id": 6, "city": "B", "reading": 90, "medianReading": 85 } ]

Cada documento se complementa con medianReading la mediana aproximada de reading todos los documentos de su partición.

Ejemplos de código

Para ver un ejemplo de código sobre el uso $median del 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: median 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", medianScore: { $median: { input: "$score", method: "approximate" } } }} ]).toArray(); console.log('Accumulator result:', accumulatorResult); // Expression usage: median of an array field const surveys = db.collection('surveys'); await surveys.insertMany([ { _id: 1, ratings: [3, 5, 7, 9, 2] }, { _id: 2, ratings: [10, 20, 30, 40, 50] }, { _id: 3, ratings: [1, 1, 2, 3, 5] } ]); const expressionResult = await surveys.aggregate([ { $project: { medianRating: { $median: { input: "$ratings", method: "approximate" } } }} ]).toArray(); console.log('Expression result:', expressionResult); // Window operator usage: median across each partition const temperatures = db.collection('temperatures'); await temperatures.insertMany([ { _id: 1, city: "A", reading: 60 }, { _id: 2, city: "A", reading: 65 }, { _id: 3, city: "A", reading: 70 }, { _id: 4, city: "B", reading: 80 }, { _id: 5, city: "B", reading: 85 }, { _id: 6, city: "B", reading: 90 } ]); const windowResult = await temperatures.aggregate([ { $setWindowFields: { partitionBy: "$city", output: { medianReading: { $median: { input: "$reading", 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: median 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', 'medianScore': { '$median': { 'input': '$score', 'method': 'approximate' } } }} ])) print('Accumulator result:', accumulator_result) # Expression usage: median of an array field surveys = db['surveys'] surveys.insert_many([ { '_id': 1, 'ratings': [3, 5, 7, 9, 2] }, { '_id': 2, 'ratings': [10, 20, 30, 40, 50] }, { '_id': 3, 'ratings': [1, 1, 2, 3, 5] } ]) expression_result = list(surveys.aggregate([ { '$project': { 'medianRating': { '$median': { 'input': '$ratings', 'method': 'approximate' } } }} ])) print('Expression result:', expression_result) # Window operator usage: median across each partition temperatures = db['temperatures'] temperatures.insert_many([ { '_id': 1, 'city': 'A', 'reading': 60 }, { '_id': 2, 'city': 'A', 'reading': 65 }, { '_id': 3, 'city': 'A', 'reading': 70 }, { '_id': 4, 'city': 'B', 'reading': 80 }, { '_id': 5, 'city': 'B', 'reading': 85 }, { '_id': 6, 'city': 'B', 'reading': 90 } ]) window_result = list(temperatures.aggregate([ { '$setWindowFields': { 'partitionBy': '$city', 'output': { 'medianReading': { '$median': { 'input': '$reading', 'method': 'approximate' }, 'window': { 'documents': ['unbounded', 'unbounded'] } } } } } ])) print('Window result:', window_result) finally: client.close() example()