pymongo返回集合中的最大值

时间:2018-12-15 08:05:41

标签: python-3.x pymongo

我有一个Database类,其中定义了多种方法,例如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,方向)   文件   “ D:\ python_projects \ price_tracker \ venv \ lib \ site-packages \ pymongo \ helpers.py”,   第63行,在_index_list中,引发TypeError(“如果未指定方向,   “ TypeError:如果未指定方向,则key_or_list必须为   列表的实例

1 个答案:

答案 0 :(得分:0)

我错过了一份退货声明。因此,当前我的数据库find min方法看起来像这样:

@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])

要在数据库类已通过我们的列表中选择此signle字典元素,我在[0]行的enc处使用切片方法

我了解pymongo.find返回一个列表,但是这与要求pymongo将列表限制为1(我认为该列表不再是列表)的选项背道而驰。