Pymongo:我怎样才能做到这一点,“双重查询”?

时间:2018-01-04 17:03:58

标签: pymongo-3.x

大家好,祝大家新年快乐。

这个问题是因为我遇到了问题,我不知道该寻找什么解决方案。我认为聚合在这里并不好。

我是一名新手级程序员,以python 3.6和pymongo 3.4开头处理Mongodb。

我在具有这种结构的“仓库”数据库中的“lostItems”集合中有50M文档:

{
    "_id": "5a4d018526f9c63894d11254",
    "time": "2000-01-03T00:02:00.000Z",
    "item": "sunglasses"
    "level": 45,
    "section": 15,
    "box": 29, 
    "home": "CA"
}

“_ id”字段是正常的自动生成密钥。 “时间”不是一个关键,并没有被强制为独特,但现在恰好如此。

让我们看看我是否可以清楚地解释我想要的查询:

  • 它将按“时间”(“时间”,pymongo.DESCENDING)订购文件

  • 它会查找并记下每个“家”:“CA”用于第二个查询。

  • 它将返回,对于每个'“home”:“CA”'命中,不仅是该文档,还有指定顺序中的5个先前文档(无论“home”值可能是什么)以及后者10份文件。

换句话说,查询将返回总共16个文档,这些文档在按“时间”排序时是连续的,对于每个“主页”:“CA”'找到。

我的方法(作为新手)将查询命中并将其写在时间数据库中,然后进行另一个查询以获取并添加前面和后面所需的文档。这感觉有点复杂,而且查询速度很慢。

import pymongo
col = pymongo.MongoClient('localhost',  27017).warehouse.lostItems
query = {"home": "CA"}
order = [ ("time",  pymongo.DESCENDING) ]

try:
    for doc in col.find(query).sort(order):
        **"Now I don't know what to do"**
except Exception as e:
    print ("Error :",  type(e), e)

您能否给我一些建议和/或告诉我这种查询是什么,以便我可以查找更多类似的案例来了解?

非常感谢您提前。

1 个答案:

答案 0 :(得分:0)

您需要一个window function,但需要doesn't exist in MongoDB,因此您必须do it in Python使用itertools package

from itertools import islice

def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result
    for elem in it:
        result = result[1:] + (elem,)
        yield result