Python pymongo在mongo数据库中插入许多可能包含重复文档的文档
我有一个mongo db,其中包含一个名为“ActiveTracking”的集合,自定义键为“dates”。周期性地,我会得到大量的新文档,这些文档可能有重复的“日期”和新的“日期” 我的记录字典如下所示:Python pymongo在mongo数据库中插入许多可能包含重复文档的文档,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有一个mongo db,其中包含一个名为“ActiveTracking”的集合,自定义键为“dates”。周期性地,我会得到大量的新文档,这些文档可能有重复的“日期”和新的“日期” 我的记录字典如下所示: dicto = [{'_id': Timestamp('2004-02-25 00:00:00'), 'low': 2.809999942779541, 'volume': 12800, 'open': 2.9000000953674316, 'high': 2.900000
dicto = [{'_id': Timestamp('2004-02-25 00:00:00'),
'low': 2.809999942779541,
'volume': 12800,
'open': 2.9000000953674316,
'high': 2.9000000953674316,
'close': 2.819999933242798,
'adjclose': 1.5342552661895752,
'dividends': 0.0},
{'_id': Timestamp('2004-02-26 00:00:00'),
'low': 2.819999933242798,
'volume': 59500,
'open': 2.8499999046325684,
'high': 2.9000000953674316,
'close': 2.890000104904175,
'adjclose': 1.572339653968811,
'dividends': 0.0},]
例如,第一条记录在数据库中,第二条不在数据库中。如果我这样做:
collection = db["STOCK"]
collection.insert_many(dicto, ordered=False)
返回
BulkWriteError: batch op errors occurred
我的集合有数千条记录,我收到的“批量”可能包含100条记录(与我在示例中显示的2条相反)。是否只向数据库批量写入唯一ID
更新
下面的代码可能有效,但我试图避免在插入之前迭代要插入的字典(以检查重复项)。我更喜欢不迭代长列表的解决方案,以区分要插入的内容,因为这可能很耗时
to_be_inserted = []
for d in dicto:
x = collection.find_one(d)
if type(x) != dict:
to_be_inserted.append(d)
collection.insert_many(to_be_inserted)
这被称为。以下伪代码应该可以工作。使用
查找一个
检查记录是否存在,如果记录不存在,则将其添加到待插入列表中。插入
最后一批全部完成
由于默认情况下,\u id
始终是索引的,因此您将在查找一个
上获得非常快的性能
如果您知道时间戳的某些属性,则可以进一步优化
通过跟踪最早和最新的时间戳,并查看传入的时间戳是否正确
在这个范围之内或之外
to_be_inserted = []
for d in candidate_records:
if col.find_one(d["_id"]):
continue
else:
to_be_inserted.append(d)
if len(d) > 0:
col.insert_many(to_be_inserted)
to_be_inserted = []
谢谢。我上面添加的代码很有效,但我正试图避免在要插入的列表/字典上进行迭代(以检查重复项),因为这可能会很慢(我正在处理财务数据,数据中的错误标记/间隙并不少见,但纠正/插入数据的速度很重要).在mongodb中必须有一种方法可以一次性完成;但是,我还没有找到它。