Доступ к полю коллекции внутри словаря python - PullRequest
0 голосов
/ 22 февраля 2020
totalHotelsInTown=hotels.aggregate([ {"$group": {"_id": "$Town", "TotalRestaurantInTown": {"$sum":1}} } ])

NumOfHotelsInTown={}

for item in totalHotelsInTown:
    NumOfHotelsInTown[item['_id']]=item['TotalRestaurantInTown']

results = hotels.aggregate(
        [{"$match": {"cuisine": cuisine}},
         {"$group": {"_id": "$town", "HotelsCount": {"$sum": 1} }}, {"$project": {"HotelsCount":1,"Percent": {"$multiply": [{"$divide": ["$HotelsCount", NumOfHotelsInTown["$_id"]]}, 100]}}},  {"$sort": {"Percent": 1}},
{"$limit": 1}])

Я хочу передать значение поля "_id" в качестве ключа для словаря python, но интерпретатор принимает "$_id" в качестве ключа вместо своего значения и дает KeyError из-за который. Любая помощь приветствуется. Спасибо!

В словаре 'NumOfHotelsInTown' есть пары ключевых значений места и количества отелей

Когда я пытаюсь получить значение из словаря NumOfHotelsInTown, я даю ключ динамически с помощью "$ _id ".

Точная ошибка, которую я получаю:

 {"$group": {"_id": "$borough", "HotelsCount": {"$sum": 1} }}, {"$project": {"HotelsCount":1,"Percent": {"$multiply": [{"$divide": ["$HotelsCount", NumOfHotlesInTown["$_id"]]}, 100]}}},  {"$sort": {"Percent": 1}},
KeyError: '$_id'

1 Ответ

0 голосов
/ 23 февраля 2020

Я вижу, что вы пытаетесь сделать, но вы не можете динамически запускать код python во время MongbDB aggregate.

Что вы должны сделать вместо этого:

  1. Получите общее количество для каждого района (который вы уже сделали)
  2. Получите общее количество для каждого района для данной кухни (в которую вы входите)
  3. Использование python сравнить 2 итога, чтобы получить список процентов, а не MongoDB

Например:

group_by_borough = {"$group": {"_id": "$borough", "TotalRestaurantInBorough": {"$sum":1}} }
count_of_restaurants_by_borough = my_collection.aggregate([group_by_borough])
restaurant_count_by_borough = {doc["_id"]: doc["TotalRestaurantInBorough"] for doc in count_of_restaurants_by_borough}

count_of_cuisines_by_borough = my_collection.aggregate([{"$match": {"cuisine": cuisine}}, group_by_borough])
cuisine_count_by_borough = {doc["_id"]: doc["TotalRestaurantInBorough"] for doc in count_of_cuisines_by_borough}

percentages = {}

for borough, count in restaurant_count_by_borough.items():
    percentages[borough] = cuisine_count_by_borough.get(borough, 0) / float(count) * 100

# And if you wanted it sorted you can use an OrderedDict

from collections import OrderedDict
percentages = OrderedDict(sorted(percentages.items(), key=lambda x: x[1]))
...