Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BulkOperations向上插入引发无效的BSON字段名_Java_Mongodb_Spring Boot - Fatal编程技术网

Java BulkOperations向上插入引发无效的BSON字段名

Java BulkOperations向上插入引发无效的BSON字段名,java,mongodb,spring-boot,Java,Mongodb,Spring Boot,这是我的java代码 public void upsertAll(final List<StringEntry> strings) { BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, StringEntry.class, DOCUMENT); List<Pair<Query, Update>> operations = new A

这是我的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();
}

如何使批量upsert函数工作?

在查看了库的源代码和测试之后,我成功地解决了我的问题

public void upsertAll(最终列表字符串){
FindAndReplaceOptions=FindAndReplaceOptions.options();
BulkOperations bulkOps=mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED,StringEntry.class,DOCUMENT);
列表操作=新建ArrayList();
for(StringEntry字符串:字符串){
查询=新查询();
query.addCriteria(Criteria.where(“msgid”).is(string.getMsgId());
单据单据=新单据();
mongoTemplate.getConverter().write(字符串,文档);
bulkOps=bulkOps.replaceOne(查询、文档、选项.upsert());
}
bulkOps.execute();
}

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

文档说明了什么是正确的用法?我找不到任何关于用法的文档。
    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)
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();
}