Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
$ a PN
Nuovo dalla versione 8.0.1.
Usa l'$topNaccumulatore nella $group fase per restituire i primi N elementi all'interno di un gruppo in base a un ordinamento specificato. Se un gruppo contiene meno di N elementi, $topN restituisce tutti gli elementi del gruppo.
Parametri
-
n: un numero intero positivo o un'espressione che si risolve in uno, che specifica quanti risultati principali restituire per gruppo. -
sortBy: un documento che specifica il criterio di ordinamento.1Da utilizzare in ordine crescente o-1decrescente. -
output: un'espressione che specifica i campi da restituire da ciascuno dei primi N documenti.
Esempio (MongoDB Shell)
L'esempio seguente mostra come utilizzare l'$topNaccumulatore per trovare le prime 2 vendite (quantità massima) per articolo in una raccolta di vendite.
Crea documenti di esempio
db.sales.insertMany([ { item: "abc", quantity: 10, price: 5 }, { item: "abc", quantity: 7, price: 8 }, { item: "abc", quantity: 5, price: 10 }, { item: "xyz", quantity: 15, price: 3 }, { item: "xyz", quantity: 9, price: 6 }, { item: "xyz", quantity: 3, price: 12 } ])
Esempio di interrogazione
db.sales.aggregate([ { $group: { _id: "$item", topTwoSales: { $topN: { n: 2, sortBy: { quantity: -1 }, output: { quantity: "$quantity", price: "$price" } } } } } ])
Output
[
{ "_id": "xyz", "topTwoSales": [{ "quantity": 15, "price": 3 }, { "quantity": 9, "price": 6 }] },
{ "_id": "abc", "topTwoSales": [{ "quantity": 10, "price": 5 }, { "quantity": 7, "price": 8 }] }
]
Esempio di utilizzo dell'operatore di finestra (MongoDB Shell)
Nuovo dalla versione 8.0.2.
L'$topNoperatore può essere utilizzato anche come operatore di finestra nello $setWindowFields stage. In questo contesto, restituisce un array dei output primi N documenti (in base a quello dell'operatoresortBy) tra i documenti in ogni finestra. Si specifica l'operatore sotto il output campo e, facoltativamente, si definiscono i confini della finestra con un window documento.
Nota
Se utilizzato come operatore di finestra in$setWindowFields, $topN è limitato a 100 MB di dati intermedi. Un'operazione che supera questo limite restituisce un errore.
Crea documenti di esempio
db.matchScores.insertMany([ { _id: 1, player: "Alice", round: 1, score: 20 }, { _id: 2, player: "Alice", round: 2, score: 35 }, { _id: 3, player: "Alice", round: 3, score: 28 }, { _id: 4, player: "Bob", round: 1, score: 15 }, { _id: 5, player: "Bob", round: 2, score: 40 } ]);
Esempio di interrogazione
L'esempio seguente suddivide i documenti in baseplayer, ordina ogni partizione in base round e restituisce i due round con il punteggio più alto visualizzati dall'inizio della partizione fino al documento corrente.
db.matchScores.aggregate([ { $setWindowFields: { partitionBy: "$player", sortBy: { round: 1 }, output: { topTwoRoundsSoFar: { $topN: { n: 2, sortBy: { score: -1 }, output: { round: "$round", score: "$score" } }, window: { documents: ["unbounded", "current"] } } } } } ]);
Output
[
{ "_id": 1, "player": "Alice", "round": 1, "score": 20, "topTwoRoundsSoFar": [{ "round": 1, "score": 20 }] },
{ "_id": 2, "player": "Alice", "round": 2, "score": 35, "topTwoRoundsSoFar": [{ "round": 2, "score": 35 }, { "round": 1, "score": 20 }] },
{ "_id": 3, "player": "Alice", "round": 3, "score": 28, "topTwoRoundsSoFar": [{ "round": 2, "score": 35 }, { "round": 3, "score": 28 }] },
{ "_id": 4, "player": "Bob", "round": 1, "score": 15, "topTwoRoundsSoFar": [{ "round": 1, "score": 15 }] },
{ "_id": 5, "player": "Bob", "round": 2, "score": 40, "topTwoRoundsSoFar": [{ "round": 2, "score": 40 }, { "round": 1, "score": 15 }] }
]
Ogni documento è arricchito dai due round con topTwoRoundsSoFar il punteggio più alto all'interno della relativa partizione fino al documento corrente incluso. Se la finestra contiene meno di due documenti, vengono restituiti tutti.
Esempi di codice
Per visualizzare un esempio di codice per l'utilizzo $topN dell'operatore, scegli la scheda corrispondente alla lingua che desideri utilizzare. Gli esempi seguenti mostrano sia l'utilizzo dell'accumulatore (in$group) che l'utilizzo dell'operatore di finestra (in$setWindowFields):