首页 > 解决方案 > mongoDB组不同值和返回数组的组合

问题描述

我的数据库在 MongoDB 4.4 版中,我正在使用 pymongo 来获取数据。假设我有一个 MongoDB 集合,如下所示:

{
    "_id":1,
    "device":{"deviceId":'A1',"deviceName":'Some_device'},
    "location":{"latitude":12.3456,"longitude":-78.9}
}
{
    "_id":2,
    "device":{"deviceId":'A2',"deviceName":'Some_other_device'},
    "location":{"latitude":12.3456,"longitude":-78.9}
}
{
    "_id":3,
    "device":{"deviceId":'A1',"deviceName":'Some_device'},
    "location":{"latitude":11.1111,"longitude":-55.5555}
}
{
    "_id":4,
    "device":{"deviceId":'B1',"deviceName":'New_device'},
    "location":{"latitude":12.3456,"longitude":-55.5555}
}

对于纬度和经度的每个唯一组合,我需要对应资产的数组,如下所示:

{
    "location":{"latitude":12.3456,"longitude":-78.9},
    {"device": "deviceId":['A1','A2'], "deviceName":['Some_device','Some_other_device']}
}
{
    "location":{"latitude":11.1111,"longitude":-55.5555},
    {"device": "deviceId":['A1'], "deviceName":['Some_device']}
}
{
    "location":{"latitude":12.3456,"longitude":-55.5555},
    {"device": "deviceId":['B1'], "deviceName":['New_device']}
}

我尝试一次获取所有数据并执行操作。但是集合太大而无法响应。无论如何我可以通过查询操作获得结果吗?

标签: mongodbpymongo

解决方案


您可以通过聚合来实现这一点

在这里工作的游乐场

db.collection.aggregate([
  {
    "$group": {
      "_id": {
        latitude: "$location.latitude",
        longitude: "$location.longitude"
      },
      "deviceId": {
        "$addToSet": "$device.deviceId"
      },
      "deviceName": {
        "$addToSet": "$device.deviceName"
      }
    }
  },
  {
    "$project": {
      _id: 0,
      location: {
        latitude: "$_id.latitude",
        longitude: "$_id.longitude"
      },
      device: {
        deviceId: "$deviceId",
        deviceName: "$deviceName"
      }
    }
  }
])

推荐阅读