Pymongo возвращает максимальное значение в коллекции - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть класс базы данных, в котором определены несколько методов, таких как find_one, find, update и т. Д. Вот пример:

@staticmethod
def find(collection, query):
    return Database.DATABASE[collection].find(query)

Чтобы вернуть все элементы и вернуть их как элементы классакоторый я могу позже выполнить, используя следующий код внутри другого класса:

@classmethod
def all(cls):
    return [cls(**elem) for elem in Database.find(ItemConstants.COLLECTION, {})]

Я пытаюсь вернуть минимальное значение на основе имени столбца, через который я прохожу:

@classmethod
def get_by_parameters(cls, name, category, url, size):
    return [cls(**elem) for elem in Database.find(ItemConstants.COLLECTION,
                                                  {"name": name, "category": category, "url": url,
                                                   "size": size}).sort('time', pymongo.DESCENDING).limit(1)][0]

И эта работа полностью работает и возвращает один единственный элемент класса.

Но я борюсь с тем, что я пытаюсь создать метод внутри класса Database, который называется find_min, здеськод для того: Класс базы данных:

@staticmethod
def find_min(collection, query, column):
    Database.DATABASE[collection].find(query).sort({column: pymongo.ASCENDING}).limit(1)

И вот как я использую другой метод, чтобы вызвать его.

@classmethod
def get_by_parameters(cls, name, category, url, size):
    return cls(**Database.find_min(ItemConstants.COLLECTION,
                                   {"name": name, "category": category, "url": url,
                                    "size": size}, 'time'))

И это не работает, яполучаю следующую ошибку:

Файл "D: \ python_projects \ price_tracker \ venv \ lib \ site-packages \ pymongo \ cursor.py", строка 676, в ключах сортировки = helpers._index_list(key_or_list, direction) Файл "D: \ python_projects \ price_tracker \ venv \ lib \ site-packages \ pymongo \ helpers.py ", строка 63, в _index_list поднять TypeError (" если направление не указано, "TypeError: если направление не указано, key_or_list должен быть экземпляром списка

1 Ответ

0 голосов
/ 19 декабря 2018

Мне не хватало возврата.Поэтому в настоящее время мой метод Мин. Базы данных выглядит следующим образом:

@staticmethod
def find_min(collection, query, column):
    return Database.DATABASE[collection].find(query).sort(column, pymongo.ASCENDING).limit(1)

, который возвращает список с одним элементом словаря внутри!

Другой класс URL, который вызывает метод, описанный выше, выглядит следующим образом:

@classmethod
def find_oldest(cls):
    return cls(**Database.find_min(URLConstants.COLLECTION, {}, "last_run_time")[0])

Чтобы подобрать этот элемент словаря словаря в списке, который нам передал класс базы данных, я использую метод нарезки в коде строки [0]

Я понимаю, что pymongo.findвозвращает список, но это как бы идет вразрез с опцией, запрашивающей pymongo ограничить список 1, который, по моему мнению, больше не должен быть списком.

...