【问题标题】:How to iterate through every other document from a mongo db cursor如何从 mongo db 游标遍历所有其他文档
【发布时间】:2018-11-03 17:07:57
【问题描述】:

我有一个 mongo DB 游标,其中包含要创建到 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,但据我了解,它跳过了我给它的数字的开头。这就是为什么我现在在拥有光标并为每个其他文档创建数据框后解决这个问题

【问题讨论】:

    标签: python mongodb pymongo


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 2014-10-23
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      相关资源
      最近更新 更多