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.
$ maximum N
Nouveau depuis la version 8.0.1.
L'$maxNopérateur d'Amazon DocumentDB renvoie les N plus grandes valeurs. Lorsqu'il est utilisé comme accumulateur dans une $group étape, il renvoie un tableau des N valeurs maximales de chaque groupe. Lorsqu'il est utilisé comme opérateur d'expression de tableau, il renvoie les N éléments maximum d'un tableau.
Paramètres
-
input: expression qui renvoie au tableau ou au champ à partir duquel lesnvaleurs maximales doivent être renvoyées. -
n: expression qui se résout en un entier positif spécifiant le nombre de valeurs maximales à renvoyer.
Comportement
Comportement des opérateurs d'expression de tableau
-
Vous ne pouvez pas spécifier une valeur
ninférieure à1. -
$maxNfiltre lesnullvaleurs présentes dans leinputtableau. -
Si la valeur spécifiée
nest supérieure ou égale au nombre d'éléments duinputtableau,$maxNrenvoie tous les éléments duinputtableau. -
Si elle est
inputrésolue en une valeur non matricielle, l'opération d'agrégation entraîne des erreurs. -
S'il
inputcontient à la fois des éléments numériques et des éléments de chaîne, les éléments de chaîne sont triés avant les éléments numériques selon l'ordre de comparaison BSON.
Comportement de l'accumulateur
-
Lorsqu'il est utilisé comme accumulateur,
nil doit s'agir d'une expression intégrale positive qui est soit une constante, soit dépend de la_idvaleur de$group. -
$maxNfiltre les valeurs nulles et manquantes. -
Si le groupe contient moins d'
néléments,$maxNrenvoie tous les éléments du groupe. -
$maxNcompare les données d'entrée selon l'ordre de comparaison BSON pour déterminer le type de sortie approprié. Lorsque les données d'entrée contiennent plusieurs types de données, le type$maxNde sortie est le plus élevé dans l'ordre de comparaison.
Ordre des sorties
$maxNrenvoie des valeurs sans ordre de tri particulier. S'il est obligatoire de garantir un ordre de tri particulier, $topN utilisez-le plutôt ou enveloppez le résultat avec$sortArray.
Exemple (MongoDB Shell)
L'exemple suivant montre comment utiliser l'$maxNaccumulateur pour récupérer les deux meilleurs scores pour chaque sujet.
Créez des exemples de documents
db.scores.insertMany([ { subject: "math", score: 85 }, { subject: "math", score: 72 }, { subject: "math", score: 93 }, { subject: "math", score: 68 }, { subject: "science", score: 90 }, { subject: "science", score: 78 }, { subject: "science", score: 65 }, { subject: "science", score: 88 } ]);
Exemple de requête
db.scores.aggregate([ { $group: { _id: "$subject", highestTwo: { $maxN: { input: "$score", n: 2 } } } } ]);
Sortie
[
{ "_id": "math", "highestTwo": [85, 93] },
{ "_id": "science", "highestTwo": [88, 90] }
]
Exemple d'utilisation d'expressions (MongoDB Shell)
L'$maxNopérateur peut également être utilisé comme expression au sein d'une $project étape pour renvoyer les N plus grands éléments d'un champ de tableau.
Créez des exemples de documents
db.readings.insertMany([ { _id: 1, sensor: "A", values: [45, 12, 78, 3, 56] }, { _id: 2, sensor: "B", values: [90, 23, 67, 11, 44] } ]);
Exemple de requête
db.readings.aggregate([ { $project: { highestThree: { $maxN: { input: "$values", n: 3 } } }} ]);
Sortie
[
{ "_id": 1, "highestThree": [45, 56, 78] },
{ "_id": 2, "highestThree": [44, 90, 67] }
]
Exemple d'utilisation d'un opérateur de fenêtre (MongoDB Shell)
Nouveau depuis la version 8.0.2.
L'$maxNopérateur peut également être utilisé comme opérateur de fenêtre dans la $setWindowFields scène. Dans ce contexte, elle renvoie un tableau contenant les valeurs les n plus élevé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, $maxN 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.stockPrices.insertMany([ { _id: 1, ticker: "ABC", hour: 1, price: 50 }, { _id: 2, ticker: "ABC", hour: 2, price: 45 }, { _id: 3, ticker: "ABC", hour: 3, price: 60 }, { _id: 4, ticker: "ABC", hour: 4, price: 40 }, { _id: 5, ticker: "XYZ", hour: 1, price: 30 }, { _id: 6, ticker: "XYZ", hour: 2, price: 35 }, { _id: 7, ticker: "XYZ", hour: 3, price: 25 } ]);
Exemple de requête
L'exemple suivant partitionne les documents particker, trie chaque partition par hour et renvoie les deux prix les plus élevés enregistrés depuis le début de la partition jusqu'au document en cours.
db.stockPrices.aggregate([ { $setWindowFields: { partitionBy: "$ticker", sortBy: { hour: 1 }, output: { highestTwoSoFar: { $maxN: { input: "$price", n: 2 }, window: { documents: ["unbounded", "current"] } } } } } ]);
Sortie
[
{ "_id": 1, "ticker": "ABC", "hour": 1, "price": 50, "highestTwoSoFar": [50] },
{ "_id": 2, "ticker": "ABC", "hour": 2, "price": 45, "highestTwoSoFar": [50, 45] },
{ "_id": 3, "ticker": "ABC", "hour": 3, "price": 60, "highestTwoSoFar": [60, 50] },
{ "_id": 4, "ticker": "ABC", "hour": 4, "price": 40, "highestTwoSoFar": [60, 50] },
{ "_id": 5, "ticker": "XYZ", "hour": 1, "price": 30, "highestTwoSoFar": [30] },
{ "_id": 6, "ticker": "XYZ", "hour": 2, "price": 35, "highestTwoSoFar": [35, 30] },
{ "_id": 7, "ticker": "XYZ", "hour": 3, "price": 25, "highestTwoSoFar": [35, 30] }
]
Chaque document est augmenté highestTwoSoFar des deux plus grandes price valeurs de sa fenêtre. Comme indiqué dans la section Ordre des sorties, l'ordre des valeurs dans le tableau renvoyé n'est pas garanti.
Exemples de code
Pour afficher un exemple de code d'utilisation de l'$maxNopé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) :