Java 大量插入大型MongoDB集合的性能较慢

Java 大量插入大型MongoDB集合的性能较慢,java,mongodb,performance,insert,Java,Mongodb,Performance,Insert,我有JSON格式的数据,其中包含数百万条我想插入MongoDB数据库的记录。我创建了一个JAVA程序,该程序读取JSON文件,对其进行解析,并使用insertMany()方法将其批量插入MongoDB集合。每个批量插入包含10000个文档。文档的平均大小为13KB。在向集合中插入大约30万个文档后,插入的性能开始逐渐降低。除了MongoDB提供的默认索引外,集合上没有其他索引 我已经查看了mongod.log来诊断问题,在集合包含大约300000个文档之后,每一次大容量插入都会导致在整个集合上使

我有JSON格式的数据,其中包含数百万条我想插入MongoDB数据库的记录。我创建了一个JAVA程序,该程序读取JSON文件,对其进行解析,并使用
insertMany()
方法将其批量插入MongoDB集合。每个批量插入包含10000个文档。文档的平均大小为13KB。在向集合中插入大约30万个文档后,插入的性能开始逐渐降低。除了MongoDB提供的默认索引外,集合上没有其他索引

我已经查看了mongod.log来诊断问题,在集合包含大约300000个文档之后,每一次大容量插入都会导致在整个集合上使用COLLSCAN执行聚合命令。在收集了300000份文档后,扫描过程大约需要30秒。大容量插入操作本身的时间不会改变,平均为200毫秒/10000个文档

MongoDB的完整日志文件可在此处找到:

下面的JSON输出是在从mongod.log文件提取每次插入后执行的聚合命令的示例。在这里,扫描时间超过6秒

我能做些什么来避免每次批量插入后的收集扫描

I COMMAND  [conn2] command diploma.patent command: aggregate { 
    aggregate: "patent", 
    pipeline: [
        { $match: {}
        },
        { $group: { 
            _id: null, 
            n: { $sum: 1
                }
            }
        }
    ], cursor: {}, 
    $db: "diploma", 
    $readPreference: { mode: "primaryPreferred" }
} 
planSummary: COLLSCAN 
keysExamined: 0 
docsExamined: 2453599 
cursorExhausted: 1 
numYields: 19422 
nreturned: 1 
reslen: 123 
locks: { 
    Global: { 
        acquireCount: { 
            r: 19424
        }
    }, 
    Database: { 
        acquireCount: { 
            r: 19424
        }
    }, 
    Collection: { 
        acquireCount: { 
            r: 19424
        }
    }
} protocol:op_msg 6274ms

你在使用什么mongo连接器?我没有使用mongo连接器,只有MongoDB Java驱动程序。你真的没有在代码中使用任何聚合吗?不确定它为什么执行此聚合。。。看起来这个聚合对所有对象都进行了简单的计数,但没有接近优化的地方,因为$group不处理索引afaik。哦,你是对的。我正在调用
countDocuments()
,但没有意识到这是一个性能非常高的操作。非常感谢。