我正在尝试将插入文档批处理到MongoDB中。此外,我还想在多个线程中这样做:
final AtomicInteger i = new AtomicInteger(0);
final List<InsertOneModel<Document>> set = new CopyOnWriteArrayList<>();
dbObjects.stream().parallel().forEach(it -> {
set.add(it);
if (i.incrementAndGet() % 1000 == 0) {
mongoDBService.insertBulk(metaInfo, set);
set.clear();
}
});
mongoDBService.insertBulk(metaInfo, set);insertBulk方法如下所示:
public void insertBulk(EntryMetaInfo collectionInfo, List<InsertOneModel<Document>> dbObjects) {
MongoDatabase db = getDb(collectionInfo);
MongoCollection<Document> collection = db.getCollection(collectionInfo.getCollectionName());
collection.bulkWrite(dbObjects);
}我还尝试了insertMany方法。我在pom中使用以下依赖项:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.6.4</version>
</dependency>我得到以下错误:
服务器本地主机上的
大容量写入操作错误:27017。写入错误: BulkWriteError{index=0,code=11000,message=‘E 11000重复键错误集合: dbName.collectionName索引: id键:{ _id: ObjectId('5e312c46e9a20f090e52132c') },details={ }。
如果我移除并行(),那么所有东西都能工作。怎样做才能使数据以批和多个流的形式写入?
UPD:要插入的对象,我得到如下所示:
List<InsertOneModel<Document>> dbObjects = fiasFileService.processFile(file, ADDR_OBJ_MAPPER);
public static final DbfMapper<InsertOneModel<Document>> ADDR_OBJ_MAPPER = row ->
new InsertOneModel<>(
new Document()
.append("_id", new ObjectId())
.append("actstatus", row.getInt("ACTSTATUS"))
.append("aoguid", row.getString("AOGUID"))
.append("aoid", row.getString("AOID"))
.append("aolevel", row.getInt("AOLEVEL"))
.append("areacode", row.getString("AREACODE"))
);也就是说,我形成一个唯一标识符(_id),但是仍然存在一个错误。
发布于 2020-01-29 07:15:59
如果文档没有指定_id字段,那么mongod将添加_id字段并为文档分配唯一的ObjectId。大多数驱动程序都会创建一个ObjectId并插入_id字段,但是如果驱动程序或应用程序没有创建和填充_id,那么mongod就会创建和填充_id。
有两种解决方案
https://stackoverflow.com/questions/59962030
复制相似问题