Mongodb批量插入有序行为

时间:2018-05-17 14:07:02

标签: mongodb

我有一个应用程序(在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个。

这是什么意思?

  1. 我的插页中有996个是重复的(这是不太可能的)?
  2. ordered:false选项不允许插入继续?
  3. 文档字面意思是单一,因为只有一次写入失败,然后在第二次失败时出错?
  4. 我正在读取错误的日志输出,而我实际上正在获取所有这些写入内容?
  5. 以上只适用于mongos?我正在使用mongod
  6. 修改 这是运行查询的代码(请注意,据我所知,批处理它的驱动程序,我们向此方法发送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 = {}}]。

0 个答案:

没有答案