Python pymongo在mongo数据库中插入许多可能包含重复文档的文档

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

我有一个mongo db,其中包含一个名为“ActiveTracking”的集合,自定义键为“dates”。周期性地,我会得到大量的新文档,这些文档可能有重复的“日期”和新的“日期”

我的记录字典如下所示:

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中必须有一种方法可以一次性完成;但是,我还没有找到它。