我在具有许多线程的情况下使用mongodb,该线程可能会在DB中插入/更新文档/记录。_id是通过组合所有字段(以_id标识的文档插入或更新)构成的。我使用了如下的Java代码。我期望在多线程方案中,如果记录/文档不存在,则任何线程都可以使用_id和线程特定的cols / fields插入新的记录/文档,在记录可用后,任何线程都可以更新其线程特定的cols / fields。但是在测试中,如果记录已经可用,则会针对已存在重复的_id报告错误,但是我只将_id放置在Filter中而不是要设置的文档中。要解决此问题,我必须添加分布式锁(redis)或捕获_id复制的异常并使用upsert设置为false进行更新,但是这2个都不那么干净整洁,并且对性能的影响都超过100毫秒。 mongodb上的任何专家都可以帮助我吗?
String rkValue = (String) newObjFromRow;
Bson rkFilter = Filters.eq(rkName, rkValue);
Document document = MyMongoRow.toDocument(row, groupByGuidTsList, groupByGuidTsIndexList);
Document wrappedUpdate = new Document();
wrappedUpdate.put("$set", updateDoc);
updateOneDocWNCompare(rkFilter, MongodbConstants.methodSetOnInsert, document, true);
UpdateOptions options = new UpdateOptions();
options.upsert(true);
collection.updateOne(rkFilter, wrappedUpdate, options);
答案 0 :(得分:0)