Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何定期检查集合中的更改_Python_Mongodb_Pymongo_Airflow - Fatal编程技术网

Python 如何定期检查集合中的更改

Python 如何定期检查集合中的更改,python,mongodb,pymongo,airflow,Python,Mongodb,Pymongo,Airflow,我正在使用Python脚本(pymongo)从MongoDB导出集合,并将其摄取到其他数据库。此工作流计划使用Apache Airflow每天运行一次。每次脚本运行时,它都会导出整个集合并覆盖目标上的整个数据,但我只想获取在脚本的后续执行中对集合所做的更改,尤其是添加到集合中的新文档。 我读过其他相关问题,但建议使用“变更流”作为解决方案,但“变更流”是实时的。我希望定期更新示例,获取自上次执行脚本以来添加的新文档。 我是否必须下载并扫描整个新更新的集合,并将其与旧集合进行比较?创建一个查找表或

我正在使用Python脚本(pymongo)从MongoDB导出集合,并将其摄取到其他数据库。此工作流计划使用Apache Airflow每天运行一次。每次脚本运行时,它都会导出整个集合并覆盖目标上的整个数据,但我只想获取在脚本的后续执行中对集合所做的更改,尤其是添加到集合中的新文档。 我读过其他相关问题,但建议使用“变更流”作为解决方案,但“变更流”是实时的。我希望定期更新示例,获取自上次执行脚本以来添加的新文档。
我是否必须下载并扫描整个新更新的集合,并将其与旧集合进行比较?

创建一个查找表或集合,在其中保存上次运行时,如果集合中的文档具有时间戳,则将时间戳和_id保存在同一个查找表中

如果文档中没有任何时间戳,那么您可以使用_id,但是这里的对象id的顺序是递增的,因为规范中说
time | machine | pid | inc
是创建ObjectId的格式

ObjectId中已经有一个时间组件,但以秒为单位。Mongo中的日期类型表示从历元开始的毫秒数,这将为您计算插入时间提供更高的精度


如果需要超过毫秒的绝对精度,我建议使用序列号形式的计数器,并将上一个序列和下一次运行的get query by than存储起来,以便仅获取增量数据。

感谢您的详细解释。我会试试,但我不懂计数器的用法。您的意思是在集合中添加一个新列,为每个条目提供一个序列号?虽然在现有文档中修改的可能性较小,但如何跟踪现有文档中的其他更改(如删除或更新)?使用oplog可以获得这些详细信息,因此oplog只不过是使用操作日志(“oplog”)存储写操作的复制。这些操作在其他节点上异步重播。基本上,OpLog是按操作顺序存储的写入操作(更新、删除、插入)的集合,这允许复制集集群的其他成员将这些更改应用于其数据库的本地副本。通过读取这个oplog,您可以捕获所需的数据。因此,我保留脚本最后一次运行的时间戳,并检查oplog,如果在该时间戳之后有条目。是吗?是的,这应该能满足你的需求。您可以从气流数据库中获取每个dag_id的最后时间戳谢谢,我现在检查oplog。这对我来说是全新的,所以我还在学习。