【发布时间】:2022-01-19 22:55:11
【问题描述】:
我有一个由公司组成的集合。每个公司都有一个“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 中找不到任何类似功能的明确示例。
请注意,这是针对学校作业的,因此无法使用第三方库。另外,我希望这一切都可以通过简单的 sn-p 代码完成,甚至可能是一次调用。我当然可以创建新的中间集合或在 Python 中执行此操作并在那里处理数据,但这可能超出了作业的范围。
任何能指出我正确方向的东西都将不胜感激!
【问题讨论】:
-
您无法在 mongo 或 SQL 或任何其他语言中“获取所有公司的每个州的员工人数”,因为您一开始就没有此信息. 每家公司只有 number_of_employees 总数,每家公司可以在不同的州设有“办事处”。如果 Technorati 有 2 个办事处——一个在加州,另一个在亚利桑那州,如何拆分 35 名员工?
-
我在我的问题中准确地解释了。我将它们平均分配到各个办公室。我意识到这并不完美,但这是我能做到的最好的(我已经向教授指出了这个缺陷)。
-
this 你在找什么吗?
-
啊,确实错过了这一部分。所以如果是一个近似值,半个人不是问题吧?
-
@ray 稍作调整以按照我想要的方式进行四舍五入,效果很好,谢谢!如果您将其作为答案,我可以接受。
标签: mongodb mongodb-query