我有一个mongo数据库游标,其中包含我想要创建到Dataframes中的文档。但是,该光标中的文档可能会runTime
过于接近。因此,我希望获取所有其他文档,并从中创建数据框。
all_df_forecast = []
for doc in cursor[::2]:
single_fc_df = pd.DataFrame(doc['data']['PRICES SPOT'])
all_df_forecast.append(single_fc_df)
位于IndexError: Cursor instances do not support slice steps
的结果 尝试2。
all_df_forecast = []
for doc in range(0, cursor.count(), 2):
single_fc_df = pd.DataFrame(doc['data']['PRICES SPOT'])
all_df_forecast.append(single_fc_df)
TypeError: 'int' object is not subscriptable
中的结果
现在这是光标与具有数据的文件的对应关系。
cursor = self._collection.find({
"Type": "f",
"runTime": { "$gte": model_dt_from, "$lte": model_dt_till },
"data.PRICES SPOT.0": { "$exists": True }
})
理想情况下,如果光标可以只根据我给出的查询得到所有其他文档,那将是理想的。我来到skip,但根据我的理解,它会以我给出的数字跳过开头。这就是为什么我现在正在处理这个问题后,我有光标并为每个其他文档创建数据帧
答案 0 :(得分:1)
使用cursor.next()
跳过每个备用光标结果。
作为示范:
from pymongo import MongoClient
client = MongoClient()
db = client.test
db.pytest.delete_many({})
db.pytest.insert_many([{ 'value': i+1 } for i,x in enumerate([1] * 10)])
cursor = db.pytest.find({},{ '_id': 0 })
count = cursor.count()
print count
cursor.next()
for doc in cursor:
print doc
count -= 2
print count
if (count > 0):
cursor.next()
会回来:
10
{u'value': 2}
8
{u'value': 4}
6
{u'value': 6}
4
{u'value': 8}
2
{u'value': 10}
0
调用cursor.next()
时,唯一需要注意的是光标在调用之前实际上有剩余的结果,否则由于光标耗尽会引发异常。出于这个原因,你会做一些事情,比如获取cursor.count()
,然后在你决定发布之前减少并跟踪剩余部分。
请注意"奇数"编号结果会在检查之前消耗光标,所以当其余文档为0
时,确实不会将光标推进偶数编号的结果上。
您部分尝试的替代方法是将光标转换为list
,然后您可以抓取切片,但这意味着将所有结果加载到内存中,这对于大多数合理大小的结果集来说可能是不切实际的。