首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在多个流中批次写入mongoDB错误

在多个流中批次写入mongoDB错误
EN

Stack Overflow用户
提问于 2020-01-29 07:07:45
回答 1查看 494关注 0票数 0

我正在尝试将插入文档批处理到MongoDB中。此外,我还想在多个线程中这样做:

代码语言:javascript
运行
复制
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方法如下所示:

代码语言:javascript
运行
复制
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中使用以下依赖项:

代码语言:javascript
运行
复制
    <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:要插入的对象,我得到如下所示:

代码语言:javascript
运行
复制
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),但是仍然存在一个错误。

EN

回答 1

Stack Overflow用户

发布于 2020-01-29 07:15:59

如果文档没有指定_id字段,那么mongod将添加_id字段并为文档分配唯一的ObjectId。大多数驱动程序都会创建一个ObjectId并插入_id字段,但是如果驱动程序或应用程序没有创建和填充_id,那么mongod就会创建和填充_id。

有两种解决方案

  1. 您可以在插入之前暂停片刻。
  2. 您可以制作我们自己的_id,这应该是唯一的。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59962030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档