python遍历mongodb时,如何保存游标位置到本地

项目中遇到一个需求,需要将一个千万条记录级别的mongodb库提取部分字段转到postgresql中。
由于mongodb一直在更新,所以每隔一段时间就需要倒一次数据。所以想实现增量更新的功能。
问题是,我要如何保存上一次python遍历到的位置?

ps:mongodb的_id字段是自动生成的,其他字段无严格的递增或递减的数量关系。

阅读 3.7k
1 个回答

如果文档中的 _id 字段是由 mongo 自动生成的, 那么本身这个字段就带有时序, 因为 ObjectId 四要素
中就有插入时间, query 语句中啥也不写, 其结果就是按时序排序的. 下面语句就可以返回 collection 中的最新 10 条数据:

db.collection.find().sort({ _id : -1 }).limit(10)

也可以根据 ObjectId 包含创建时间的特性, 通过构造 ObjectId 的办法, 来指定查询某时间段内的文档. 下面的 python 程序可以查询 2018-04-10 日之后插入到 collection 中的文档 (手敲, 亲测有效):

#!/usr/bin/python
import sys
import datetime
from pymongo import MongoClient
from bson import objectid

mongo_conn = MongoClient("mongodb://user:pass@11.22.33.44:27017")

gen_time = datetime.datetime(2018, 4, 10)
dummy_id = objectid.ObjectId.from_datetime(gen_time)
cursor = mongo_conn['your_db']['collection'].find(
    {'_id' : {'$gt' : dummy_id} }
)

for v in cursor:
    print(v)

所以, 你的需求中, 只需要保存 _id 字段即可, 或者保存一个时间戳也可以.

另, 如果你的这个 collection 被设置为 Capped Collections, 那么你还可以考虑使用 Tailable Cursors 来时刻获取更新数据. 当然我估计这应该不符合你的使用场景.

参考:
mongo ObjectId
mongo Tailable Cursors
mongo Capped Collections
python datetime
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题