Warm tip: This article is reproduced from serverfault.com, please click

pymongo-在MongoDB中使用Aggregate函数进行除法和除法运算

(pymongo - Using Aggregate function in MongoDB to Divide and Mutliply)

发布于 2020-11-28 09:07:21
[{
  "_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"]
                    }
                }
        }
    ]
)

请帮我!谢谢

Questioner
der
Viewed
11
Belly Buster 2020-11-28 18:27:49

如果只对第一个数组元素感兴趣$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