【问题标题】:Pymongo: How can I make this, "double query"?Pymongo:我怎样才能做到这一点,“双重查询”?
【发布时间】:2018-01-06 20:05:50
【问题描述】:

大家好,新年快乐。

这个问题是因为我有一个问题,我不知道要寻找什么作为解决方案。我认为聚合在这里不好。

我是一个新手级别的程序员,从 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)

  • 它将查找并以某种方式记下每个 "home": "CA" 以用于第二个查询。

  • 对于每个 '"home": "CA"' 命中,它将返回,不仅是该文档,而且还包括按指定顺序的前 5 个文档(无论 "home" 值可能是什么)和后面的文档10 个文件。

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

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

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)

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

提前非常感谢您。

【问题讨论】:

    标签: pymongo-3.x


    【解决方案1】:

    你想要一个window function,但这个doesn't exist in MongoDB,所以你必须使用itertools packagedo it in Python

    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
    

    【讨论】:

    • 非常感谢哈特谢普苏特。我是一个新手,但据我所知,据我所知,要做到这一点,我必须让整个数据库与元素一起工作,这样我才能得到结果。每次我进行查询时,这大约是 5 GB。我弄错了吗?
    • @Deus 您是要获取有关一个项目和 16 个周围项目的信息,还是每个项目和每个项目的 16 个周围项目的信息?
    • 我正在尝试每件商品以及每件商品的周边 15 件。也就是说,如果集合中有 1000 个 '"home": "CA"',我将获得 16000 个文档以供以后使用。
    • @哈对不起,我忘了说后面的工作将使用16乘16打包的数据,并不是所有16000混合在一起的假设结果。反正我可以自己解决这个分组问题。
    • @Deus 您将使用find(query) 从数据库中获得 1000 个文档。您可以使用 window(documents) 的小修改将其转换为 16 个文档的 1000 个列表,或者将 window 的结果原样传递给分块函数。
    猜你喜欢
    • 2022-11-09
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2015-05-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多