大家好,祝大家新年快乐。
这个问题是因为我遇到了问题,我不知道该寻找什么解决方案。我认为聚合在这里并不好。
我是一名新手级程序员,以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)
您能否给我一些建议和/或告诉我这种查询是什么,以便我可以查找更多类似的案例来了解?
非常感谢您提前。
答案 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