MongoDB:链式查找(find())

8
在MongoDB中,如何链接find()方法?假设我想在Python/pymongo中执行以下操作。
query = prices.find({'symbol': "AAPL"})
if start is not None:
    query = query.find({'date': {'$gte': start}})
if end is not None:
    query = query.find({'date': {'$lte': end}})
2个回答

9
你不能链接多个find方法。调用find会返回Cursor对象。你可能想要构建一个查询,然后调用find:
from collections import OrderedDict

query = OrderedDict([('symbol', 'AAPL')])

if start is not None:
    query['date'] = {'$gte': start}
if end is not None:
    query['date'] = {'$lte': end}

cursor = prices.find(query)

谢谢。我使用了defaultdict(),以便将子字典添加到query['date']中。 - Morten

3

如果你真的喜欢链式编程的概念,你可以很容易地支持 filter 表达式的链式编程,而不是整个查询/游标。类似于:

class FilterExpression(dict):
   def __call__(self, key, cond):
       e = type(self)(self)
       e.update({key: cond})
       return e

f = FilterExpression({'symbol': "AAPL"})
if start is not None:
   f = f('date', {'$gte': start})
if end is not None:
   f = f('date', {'$lte': end})
query = prices.find(f)

FilterExpressiondict 的子类(即 IS-A dict),因此您可以直接将其传递给 find,无需先进行转换。


为什么不使用 def __call__(...): \ self.update(...) \ return self - Jérôme
@Jérôme 最好不要在原地更改过滤器。假设我的函数接受一个基础过滤器并想要添加一些条件。最好不要更改调用者的对象。 - shx2
好的。我不知道这个用例。重点只是复制实例。 - Jérôme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接