Jedziemy do zrozumienia pole _id
obrębie $group
scenicznej & spojrzeć na niektóre najlepszych praktyk konstruowania _id
S w grupie etapach agregacji. Spójrzmy na to zapytanie:
db.companies.aggregate([{
$match: {
founded_year: {
$gte: 2010
}
}
}, {
$group: {
_id: {
founded_year: "$founded_year"
},
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id.founded_year": 1
}
}]).pretty()
Jedną rzeczą, która może nie być dla nas jasne, dlaczego jest pole _id
zbudowany jest ten „dokument” sposób? Mogliśmy zrobić to w ten sposób, a także:
db.companies.aggregate([{
$match: {
founded_year: {
$gte: 2010
}
}
}, {
$group: {
_id: "$founded_year",
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id": 1
}
}]).pretty()
Nie robimy to w ten sposób, ponieważ w tych dokumentach wyjściowych - to nie jest jednoznaczne, co dokładnie oznacza ten numer. Tak naprawdę nie wiemy. A w niektórych przypadkach oznacza to zamieszanie w interpretacji tych dokumentów.Więc kolejny przypadek może grupować dokument _id
z wielu dziedzin:
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
prostu wypycha elementy do generowania tablic. Często może to być wymagane do grupy promowanych na polach do górnego poziomu:
db.companies.aggregate([{
$group: {
_id: {
ipo_year: "$ipo.pub_year"
},
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id.ipo_year": 1
}
}]).pretty()
Jest to także doskonały mieć wyrażenie postanawia dokumencie jako klucz _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
}
}])
W SQL Mam grupę, a ja mam pole do grupy przez $ państwa, _id nie wygląda jak każdy analogowych SQL. – user1700890