我有一个应用程序(在Scala中,虽然这个问题可能是驱动程序不可知),它按批量整理插入,然后进行批量插入。由于数据的接收和处理方式,我们可能会有重复的ID,我们只想忽略这些。
根据批量写入https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-example-unordered-bulk-write的文档,使用ordered: false
选项应该允许所有插入运行,而不会因为错误而导致整个写入失败。
由于这是一个无序操作,因此尽管存在异常,仍会处理队列中剩余的写入。
但是,我的错误日志会出现这样的错误
I COMMAND [conn696515]命令db.Matches命令:insert {insert:" Matches&#34 ;, ordered:false,documents:1000} ninserted:4 keysInserted:52 exception:E11000 duplicate key error collection:db 。匹配索引:_id_ dup key:{:" 3000758-3000343-3845342998431744-5-1646 ----- 10-1"代码:11000 numYields:0 reslen:183245 locks:{Global:{acquireCount:{r:1017,w:1017}},Database:{acquireCount:{w:1017}},Collection:{acquireCount:{w:1013元数据:{acquireCount:{w:4}},oplog:{acquireCount:{w:4}}} protocol:op_query 1003ms
对我来说,只有4个实际插入了我的1000个。
这是什么意思?
ordered:false
选项不允许插入继续?修改 这是运行查询的代码(请注意,据我所知,批处理它的驱动程序,我们向此方法发送10000s)
def insertMatchesIgnoreDuplicates(
matches: HashMap[BsonString,Document],
database: MongoDatabase
) : Future[_] = {
val matchesCollection: MongoCollection[Document] =
database.getCollection("Matches")
val inserts = matches.values.map(doc => {
new InsertOneModel(doc)
})
val bulkWriteOptions = new BulkWriteOptions()
bulkWriteOptions.ordered(false)
matchesCollection.bulkWrite(inserts.toSeq, bulkWriteOptions).toFuture
}
当抓住输出时,
成功了AcknowledgedBulkWriteResult {insertedCount = 15107,matchedCount = 0,removedCount = 0,modifiedCount = 0,upserts = []}
且不成功
com.mongodb.MongoBulkWriteException:服务器10.131.58.143:27017上的批量写入操作错误。写入错误:[BulkWriteError {index = 52621,code = 11000,message =' E11000重复键错误集合:betbrain_v1.Matches index: id dup key:{:" 3000177- 3000012-3858875929331712-5 --- --- 2.5 14-1" }',details = {}}]。