Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
APLICA-SE A: MongoDB vCore
O operador de acumulação $topN
retorna os N principais elementos de um grupo com base em uma ordem de classificação especificada. Ele estende a funcionalidade de $top
ao permitir que você recupere vários elementos superiores, em vez de apenas o item com maior classificação.
Sintaxe
A sintaxe do operador de acumulação $topN
é a seguinte:
{
$group: {
_id: <expression>,
<field>: {
$topN: {
n: <number>,
sortBy: { <field1>: <sort order>, <field2>: <sort order>, ... },
output: <expression>
}
}
}
}
Parâmetros
Descrição | |
---|---|
n |
O número de elementos a serem retornados. Deve ser um número inteiro positivo. |
sortBy |
Especifica a ordem de classificação usando um documento com nomes de campos e direções de ordenação (1 para crescente e -1 para decrescente). |
output |
A expressão que especifica o campo ou valor a ser retornado dos N principais documentos. |
Exemplo
Vamos entender o uso com o JSON de exemplo do conjunto de dados stores
.
{
"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
"name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
"sales": {
"totalSales": 151864,
"salesByCategory": [
{
"categoryName": "Sound Bars",
"totalSales": 2120
},
{
"categoryName": "Home Theater Projectors",
"totalSales": 45004
},
{
"categoryName": "Game Controllers",
"totalSales": 43522
},
{
"categoryName": "Remote Controls",
"totalSales": 28946
},
{
"categoryName": "VR Games",
"totalSales": 32272
}
]
},
"promotionEvents": [
{
"eventName": "Massive Markdown Mania",
"discounts": [
{
"categoryName": "DVD Players",
"discountPercentage": 14
},
{
"categoryName": "Media Players",
"discountPercentage": 21
},
{
"categoryName": "Televisions",
"discountPercentage": 22
}
]
}
]
}
Exemplo 1: Obter as três categorias mais vendidas por loja
Encontre as três categorias mais vendidas em cada loja.
db.stores.aggregate([
{ $unwind: "$sales.salesByCategory" },
{
$group: {
_id: "$_id",
storeName: { $first: "$name" },
top3Categories: {
$topN: {
n: 3,
sortBy: { "sales.salesByCategory.totalSales": -1 },
output: {
categoryName: "$sales.salesByCategory.categoryName",
totalSales: "$sales.salesByCategory.totalSales"
}
}
}
}
}
])
Isso gera uma saída mostrando as três categorias mais vendidas de cada loja:
[
{
_id: '8c8f23c9-1893-4ddd-97ad-dd57088058a5',
storeName: 'Proseware, Inc. | Camera Haven - North Jerroldville',
top3Categories: [
{ categoryName: 'Waterproof Camcorders', totalSales: 25237 },
{ categoryName: 'Camera Lenses', totalSales: 21189 },
{ categoryName: 'Action Camcorders', totalSales: 19467 }
]
},
{
_id: '7f0b0454-e22b-4646-8eb4-32ad5eb48042',
storeName: 'First Up Consultants | Tool Boutique - Paoloberg',
top3Categories: [
{ categoryName: 'Drills', totalSales: 40686 },
{ categoryName: 'Screwdrivers', totalSales: 30155 },
{ categoryName: 'Chisels', totalSales: 15762 }
]
},
.
.
.
]
Exemplo 2: Obter os dois eventos de promoção mais recentes
Encontre os dois eventos de promoção mais recentes para cada loja com base na data de início.
db.stores.aggregate([
{ $unwind: "$promotionEvents" },
{
$group: {
_id: "$_id",
storeName: { $first: "$name" },
top2RecentPromotions: {
$topN: {
n: 2,
sortBy: {
"promotionEvents.promotionalDates.startDate.Year": -1,
"promotionEvents.promotionalDates.startDate.Month": -1,
"promotionEvents.promotionalDates.startDate.Day": -1
},
output: {
eventName: "$promotionEvents.eventName",
startDate: "$promotionEvents.promotionalDates.startDate"
}
}
}
}
}
])
Isso retorna os dois eventos de promoção mais recentes para cada loja:
[
{
_id: '4a99546f-a1d2-4e61-ae9f-b8c7c1faf73c',
storeName: 'Lakeshore Retail | Stationery Nook - West Van',
top2RecentPromotions: [
{
eventName: 'Crazy Markdown Madness',
startDate: { Year: 2024, Month: 9, Day: 21 }
},
{
eventName: 'Flash Sale Fiesta',
startDate: { Year: 2024, Month: 6, Day: 23 }
}
]
},
{
_id: 'e0c47a06-4fe0-46b7-a309-8971bbb3978f',
storeName: 'VanArsdel, Ltd. | Baby Products Bargains - Elainamouth',
top2RecentPromotions: [
{
eventName: 'Crazy Deal Days',
startDate: { Year: 2024, Month: 9, Day: 21 }
}
]
},
.
.
.
]
Exemplo 3: Obter os cinco maiores descontos por categoria
Encontre as cinco categorias com as maiores porcentagens de desconto em todos os eventos de promoção para cada loja.
db.stores.aggregate([
{ $unwind: "$promotionEvents" },
{ $unwind: "$promotionEvents.discounts" },
{
$group: {
_id: "$_id",
storeName: { $first: "$name" },
top5Discounts: {
$topN: {
n: 5,
sortBy: { "promotionEvents.discounts.discountPercentage": -1 },
output: {
categoryName: "$promotionEvents.discounts.categoryName",
discountPercentage: "$promotionEvents.discounts.discountPercentage",
eventName: "$promotionEvents.eventName"
}
}
}
}
}
])
Isso mostra as cinco categorias com as maiores porcentagens de desconto para cada loja:
[
{
_id: '4a99546f-a1d2-4e61-ae9f-b8c7c1faf73c',
storeName: 'Lakeshore Retail | Stationery Nook - West Van',
top5Discounts: [
{
categoryName: 'Rulers',
discountPercentage: 24,
eventName: 'Markdown Madness'
},
{
categoryName: 'Notebooks',
discountPercentage: 21,
eventName: 'Markdown Madness'
},
{
categoryName: 'Paper Clips',
discountPercentage: 17,
eventName: 'Flash Sale Fiesta'
},
{
categoryName: 'Pencils',
discountPercentage: 15,
eventName: 'Bargain Blitz Bash'
},
{
categoryName: 'Erasers',
discountPercentage: 14,
eventName: 'Crazy Markdown Madness'
}
]
},
.
.
.
]
Conteúdo relacionado
- Examinar as opções de migração do MongoDB para o Azure Cosmos DB for MongoDB (vCore)
- Leia mais sobre Compatibilidade de recursos com o MongoDB