【问题标题】:Windowing function in MongoDBMongoDB中的窗口函数
【发布时间】: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


【解决方案1】:

你实际上是在正确的轨道上。当$group 按状态时,您只需要使用$divide$sum 派生一个额外的字段numOfEmpPerOffice

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 playground 供您参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 2018-08-10
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多