如何从mongo db游标迭代每个其他文档

时间:2018-05-24 12:48:39

标签: python mongodb pymongo

我有一个mongo数据库游标,其中包含我想要创建到Dataframes中的文档。但是,该光标中的文档可能会runTime过于接近。因此,我希望获取所有其他文档,并从中创建数据框。

尝试1。
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,但根据我的理解,它会以我给出的数字跳过开头。这就是为什么我现在正在处理这个问题后,我有光标并为每个其他文档创建数据帧

1 个答案:

答案 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,然后您可以抓取切片,但这意味着将所有结果加载到内存中,这对于大多数合理大小的结果集来说可能是不切实际的。