andremo a capire il campo _id
all'interno del $group
fase & sguardo ad alcune best practice per la costruzione di _id
s in fase di aggregazione di gruppo. Diamo un'occhiata a questa domanda:
db.companies.aggregate([{
$match: {
founded_year: {
$gte: 2010
}
}
}, {
$group: {
_id: {
founded_year: "$founded_year"
},
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id.founded_year": 1
}
}]).pretty()
Una cosa che potrebbe non essere chiaro a noi è il motivo per il campo _id
è costruito in questo modo "documento"? Abbiamo potuto fare in questo modo, così:
db.companies.aggregate([{
$match: {
founded_year: {
$gte: 2010
}
}
}, {
$group: {
_id: "$founded_year",
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id": 1
}
}]).pretty()
Non lo facciamo in questo modo, perché in questi documenti di output - non è esplicito ciò che significa esattamente questo numero. Quindi, in realtà non lo sappiamo. E in alcuni casi, ciò significa che forse c'è confusione nell'interpretazione di questi documenti.Quindi, un altro caso forse al gruppo un documento _id
con più campi:
db.companies.aggregate([{
$match: {
founded_year: {
$gte: 2010
}
}
}, {
$group: {
_id: {
founded_year: "$founded_year",
category_code: "$category_code"
},
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id.founded_year": 1
}
}]).pretty()
$push
spinge semplicemente gli elementi di matrici di generazione. Spesso, potrebbe essere richiesto di gruppo su campi promossi a livello superiore:
db.companies.aggregate([{
$group: {
_id: {
ipo_year: "$ipo.pub_year"
},
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id.ipo_year": 1
}
}]).pretty()
E 'anche perfetto per avere un'espressione che si risolve in un documento come una chiave _id
.
db.companies.aggregate([{
$match: {
"relationships.person": {
$ne: null
}
}
}, {
$project: {
relationships: 1,
_id: 0
}
}, {
$unwind: "$relationships"
}, {
$group: {
_id: "$relationships.person",
count: {
$sum: 1
}
}
}, {
$sort: {
count: -1
}
}])
In SQL ho GROUP BY e devo campo per gruppo di $ Stato, _id non assomiglia a nessun analogico SQL. – user1700890