Как перебирать любой другой документ из курсора Mongo DB - PullRequest
0 голосов
/ 24 мая 2018

У меня есть курсор БД 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 голосов
/ 25 мая 2018

Используйте 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 и затем вы можете захватывать фрагменты, но это означает загрузку всех результатов в память, что, вероятно, нецелесообразно для большинства наборов результатов разумного размера.

...