【问题标题】:BulkOperations upsert throwing Invalid BSON field nameBulkOperations upsert 抛出无效的 BSON 字段名称
【发布时间】:2021-01-13 21:30:49
【问题描述】:

这是我的java代码

public void upsertAll(final List<StringEntry> strings) {
    BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, StringEntry.class, DOCUMENT);
    List<Pair<Query, Update>> operations = new ArrayList<>();
    strings.forEach(string -> {
        Query query = new Query();
        query.addCriteria(Criteria.where("msgid").is(string.getMsgId()));  
        Document doc = new Document();
        mongoTemplate.getConverter().write(string, doc);
        Update update = Update.fromDocument(doc); 
        bulkOps.upsert(query, update);
    }); 
    bulkOps.execute();
}

堆栈跟踪异常。

    java.lang.IllegalArgumentException: Invalid BSON field name msgid
        at org.bson.AbstractBsonWriter.writeName(AbstractBsonWriter.java:534)
        at com.mongodb.internal.connection.BsonWriterDecorator.writeName(BsonWriterDecorator.java:193)
        at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:211)
        at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:154)
        at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:45)
        at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
        at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
        at com.mongodb.internal.connection.SplittablePayload$WriteRequestEncoder.encode(SplittablePayload.java:221)
        at com.mongodb.internal.connection.SplittablePayload$WriteRequestEncoder.encode(SplittablePayload.java:187)

如何让批量 upsert 功能起作用?

【问题讨论】:

  • 文档中说的正确用法是什么?
  • 我找不到任何关于使用的文档。

标签: java mongodb spring-boot


【解决方案1】:

在查看了库的源代码和测试之后,我设法解决了我的问题。 BulkOperationsIntegrationTest

public void upsertAll(final List<StringEntry> strings) {
    FindAndReplaceOptions options = FindAndReplaceOptions.options();
    BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, StringEntry.class, DOCUMENT);
    List<Pair<Query, Update>> operations = new ArrayList<>();
    for(StringEntry string: strings) {
        Query query = new Query();
        query.addCriteria(Criteria.where("msgid").is(string.getMsgId()));  
        Document doc = new Document();
        mongoTemplate.getConverter().write(string, doc);
        bulkOps = bulkOps.replaceOne(query, doc, options.upsert()); 
    }
    bulkOps.execute();
}

upsert 函数似乎并没有真正按预期工作。将其替换为 replaceOne 有效。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2016-08-01
    • 1970-01-01
    相关资源
    最近更新 更多