我有一個由公司組成的集合。每個公司都有一個“number_of_employees”以及一個“offices”的子檔案,其中包括“state_code”和“country_code”。例如:
{
'_id': ObjectId('52cdef7c4bab8bd675297da5'),
'name': 'Technorati',
'number_of_employees': 35,
'offices': [
{'description': '',
'address1': '360 Post St. Ste. 1100',
'address2': '',
'zip_code': '94108',
'city': 'San Francisco',
'state_code': 'CA',
'country_code': 'USA',
'latitude': 37.779558,
'longitude': -122.393041}
]
}
我正在嘗試獲取所有公司每個州的員工人數。我最近的嘗試看起來像:
db.research.aggregate([
{ "$match": {"offices.country_code": "USA" } },
{ "$unwind": "$offices" },
{ "$project": { "_id": 1, "number_of_employees": 1, "offices.state_code": 1 } }
])
但現在我被困在如何做$group. 因為這num_of_employees是在公司級別而不是辦公室級別,我想將它們平均分配到辦公室。例如,如果 Technorati 在 5 個不同的州有 5 個辦公室,那么每個州將分配 7 名員工。
在 SQL 中,我可以使用視窗函式輕松完成此操作,以按公司獲取不同辦公室的平均員工,然后在按州分組時對這些員工進行匯總。不過,我似乎在 MongoDB 中找不到任何類似功能的明確示例。
請注意,這是針對學校作業的,因此使用第三方庫是不可行的。另外,我希望這一切都可以在一個簡單的代碼片段中完成,甚至可能是一次呼叫。我當然可以創建新的中間集合或在 Python 中執行此操作并在那里處理資料,但這可能超出了作業的范圍。
任何能指出我正確方向的東西將不勝感激!
uj5u.com熱心網友回復:
你實際上是在正確的軌道上。您只需要numOfEmpPerOffice通過 using$divide和$sumit when $groupby state派生一個額外的欄位。
db.collection.aggregate([
{
"$match": {
"offices.country_code": "USA"
}
},
{
"$addFields": {
"numOfEmpPerOffice": {
"$divide": [
"$number_of_employees",
{
"$size": "$offices"
}
]
}
}
},
{
"$unwind": "$offices"
},
{
$group: {
_id: "$offices.state_code",
totalEmp: {
$sum: "$numOfEmpPerOffice"
}
}
}
])
這是Mongo 游樂場供您參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/384738.html
