View a markdown version of this page

percentile $ - Amazon DocumentDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

percentile $

Nouveau depuis la version 8.0.1.

Dans Amazon DocumentDB, $percentile l'opérateur calcule les valeurs percentiles spécifiées pour les données numériques. En tant qu'accumulateur, il calcule les valeurs percentiles des documents d'un groupe au $group stade d'un pipeline d'agrégation. En tant qu'expression, elle calcule les percentiles pour un tableau de nombres.

Paramètres

  • input: expression qui se résout en une valeur numérique ou en un tableau de valeurs numériques.

  • p: tableau de valeurs de percentile comprises entre 0 et 1, où chaque valeur représente un centile à calculer. Par exemple, [0.25, 0.5, 0.75] calcule les 25e, 50e et 75e percentiles.

  • method: chaîne spécifiant la méthode de calcul. Actuellement, seul "approximate" est pris en charge.

Comportement

La "approximate" méthode utilise l'algorithme t-digest pour calculer des métriques approximatives basées sur des percentiles. Dans le cas de petits ensembles de données, des valeurs de centiles distinctes peuvent aboutir au même résultat. Par exemple, avec seulement 5 valeurs par groupe, p90 et p99 peuvent toutes deux renvoyer la valeur maximale du groupe. La précision s'améliore à mesure que le nombre de points de données augmente.

Exemple (MongoDB Shell)

L'exemple suivant montre comment utiliser l'$percentileopérateur pour calculer les 25e et 75e percentiles des scores par classe.

Créez des exemples de documents

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 } ]);

Exemple de requête

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

Sortie

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

Exemple d'utilisation d'expressions (MongoDB Shell)

L'$percentileopérateur peut également être utilisé comme expression au sein d'une $project étape pour calculer les percentiles d'un champ de tableau.

Créez des exemples de documents

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] } ]);

Exemple de requête

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

Sortie

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

Exemple d'utilisation d'un opérateur de fenêtre (MongoDB Shell)

Nouveau depuis la version 8.0.2.

L'$percentileopérateur peut également être utilisé comme opérateur de fenêtre dans la $setWindowFields scène. Dans ce contexte, il calcule les valeurs percentiles spécifiées pour les documents de chaque fenêtre. Vous spécifiez l'opérateur dans le output champ et définissez éventuellement les limites de la fenêtre à l'aide d'un window document.

Note

Lorsqu'il est utilisé comme opérateur de fenêtre dans$setWindowFields, $percentile est limité à 100 Mo de données intermédiaires. Une opération dépassant cette limite renvoie une erreur.

Créez des exemples de documents

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 } ]);

Exemple de requête

L'exemple suivant partitionne les documents sensor et calcule les 25e et 75e percentiles de reading tous les documents de chaque partition.

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

Sortie

[ { "_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] } ]

Chaque document est augmenté des readingPercentiles 25e et 75e centiles approximatifs de reading tous les documents de sa partition.

Exemples de code

Pour afficher un exemple de code d'utilisation de l'$percentileopérateur, choisissez l'onglet correspondant à la langue que vous souhaitez utiliser. Les exemples suivants montrent l'utilisation de l'accumulateur (in$group), l'utilisation des expressions (in$project) et l'utilisation de l'opérateur de fenêtre (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()