【问题标题】:Using Aggregate function in MongoDB to Divide and Mutliply在MongoDB中使用聚合函数进行除法和乘法
【发布时间】:2021-03-10 20:47:29
【问题描述】:
[{
  "_id": {
    "$oid": "5fb92c5d256cb4fd463f0944"
  },
  "ppCode": "A0007",
  "ppName": "ANGULLIA PARK OFF STREET",
  "parkingSystem": "Electronic Parking System",
  "vehCat": "Car",
  "availableLot": 210,
  "parkCapacity": 268,
  "startTime": 700,
  "endTime": 1100,
  "rates": [
    {
      "weekdayMin": 30,
      "weekdayRate": 1.3,
      "satdayMin": 30,
      "satdayRate": 1.3,
      "sunPHMin": 30,
      "sunPHRate": 0.7
    }
  ],
  "modified": "2333"
}, {
  "_id": {
    "$oid": "5fb92c65256cb4fd463f0ac3"
  },
  "ppCode": "Y0019",
  "ppName": "YAN KIT ROAD / CANTONMENT ROAD OFF ST",
  "parkingSystem": "Electronic Parking System",
  "vehCat": "Motorcycle",
  "availableLot": 0,
  "parkCapacity": 8,
  "startTime": 2230,
  "endTime": 700,
  "rates": [
    {
      "weekdayMin": 510,
      "weekdayRate": 0.65,
      "satdayMin": 510,
      "satdayRate": 0.65,
      "sunPHMin": 510,
      "sunPHRate": 0.65
    }
  ],
  "modified": "2333"
}]

以上是我的 MongoDB 文档。我正在尝试使用聚合复制我在 python 中所做的事情。以下是我尝试过的。但由于它位于数组对象内,当我使用 rates.0.weekdayRate 时乘法无法工作,当我使用以下查询时,我得到一个空值返回。

Python 代码:

result = carparkCollection.find_one({"ppName": ppname, "vehCat": mvtype})
        for r in result["rates"]:
                weekday = (parktime / r["weekdayMin"]) * r['weekdayRate']
db.carpark.aggregate(
    [
        {
            $project: 
                {
                    "_id": 1,
                    
                    "ppName": 1,
                    "weekdayMin": {
                        $multiply: [
                            { 
                                $divide: [
                                    { 
                                    $multiply: [9, 60]
                                    },
                                    "$rates[0].weekdayMin"
                                    ]
                                
                            },
                            "$rates[0].weekdayRate"]
                    }
                }
        }
    ]
)

请帮帮我!谢谢

【问题讨论】:

    标签: mongodb pymongo aggregation


    【解决方案1】:

    如果你只对第一个数组元素感兴趣,在聚合开始时使用$unwind将数组转换为对象;然后您可以使用点符号访问字段。

    parktime = 10
    
    results = db.carpark.aggregate([
        {'$unwind':'$rates'},
        {'$project': {
            '_id': 1,
            'ppName': 1,
            'weekdayMin': {
                '$multiply': [
                    {'$divide': [
                        parktime,
                        '$rates.weekdayMin'
                    ]},
                    '$rates.weekdayRate'
                ]
            }
        }
    }])
    

    工作示例:

    from pymongo import MongoClient
    
    db = MongoClient()['mydatabase']
    
    db.carpark.insert_many([{
      'ppCode': 'A0007',
      'ppName': 'ANGULLIA PARK OFF STREET',
      'parkingSystem': 'Electronic Parking System',
      'vehCat': 'Car',
      'availableLot': 210,
      'parkCapacity': 268,
      'startTime': 700,
      'endTime': 1100,
      'rates': [
        {
          'weekdayMin': 30,
          'weekdayRate': 1.3,
          'satdayMin': 30,
          'satdayRate': 1.3,
          'sunPHMin': 30,
          'sunPHRate': 0.7
        }
      ],
      'modified': '2333'
    }, {
      'ppCode': 'Y0019',
      'ppName': 'YAN KIT ROAD / CANTONMENT ROAD OFF ST',
      'parkingSystem': 'Electronic Parking System',
      'vehCat': 'Motorcycle',
      'availableLot': 0,
      'parkCapacity': 8,
      'startTime': 2230,
      'endTime': 700,
      'rates': [
        {
          'weekdayMin': 510,
          'weekdayRate': 0.65,
          'satdayMin': 510,
          'satdayRate': 0.65,
          'sunPHMin': 510,
          'sunPHRate': 0.65
        }
      ],
      'modified': '2333'
    }])
    
    parktime = 10
    
    results = db.carpark.aggregate([
        {'$unwind':'$rates'},
        {'$project': {
            '_id': 1,
            'ppName': 1,
            'weekday': {
                '$multiply': [
                    {'$divide': [
                        parktime,
                        '$rates.weekdayMin'
                    ]},
                    '$rates.weekdayRate'
                ]
            }
        }
    }])
    
    print('Aggregate:')
    for result in results:
       print(result['weekday'])
    
    print('Python:')
    results = db.carpark.find()
    
    for result in results:
        for r in result["rates"]:
            weekday = (parktime / r["weekdayMin"]) * r['weekdayRate']
            print(weekday)
    

    给予:

    Aggregate:
    0.43333333333333335
    0.012745098039215686
    Python:
    0.43333333333333335
    0.012745098039215686
    

    【讨论】:

    • 哇!这很棒!抱歉,我对 NoSQL MongoDB 还是很陌生。非常感谢!
    • 如果数组中有多个项目,例如,我想对所有的 weekdayMin 求和并取平均值。
    • 如果您不熟悉所有 MongoDB 操作,我会真诚地引导您只在 python 中进行计算。
    猜你喜欢
    • 2011-07-10
    • 2020-01-03
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多