当前位置: 首页 > 面试题库 >

MongoDb upsert异常BSON字段无效

曾元忠
2023-03-14
问题内容

例外情况:

Exception in thread "Thread-1" java.lang.IllegalArgumentException: Invalid BSON field name id
    at org.bson.AbstractBsonWriter.writeName(AbstractBsonWriter.java:516)
    at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:188)
    at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:131)
    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.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:85)
    at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:43)
    at com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBodyWithMetadata(BaseWriteCommandMessage.java:129)
    at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160)
    at com.mongodb.connection.WriteCommandProtocol.sendMessage(WriteCommandProtocol.java:220)
    at com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:101)
    at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:64)
    at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:37)
    at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168)
    at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289)
    at com.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:143)
    at com.mongodb.operation.MixedBulkWriteOperation$Run$3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:490)
    at com.mongodb.operation.MixedBulkWriteOperation$Run$RunExecutor.execute(MixedBulkWriteOperation.java:656)
    at com.mongodb.operation.MixedBulkWriteOperation$Run.execute(MixedBulkWriteOperation.java:409)
    at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:177)
    at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:168)
    at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:422)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:413)
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:168)
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74)
    at com.mongodb.Mongo.execute(Mongo.java:845)
    at com.mongodb.Mongo$2.execute(Mongo.java:828)
    at com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:550)
    at com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:542)
    at com.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:381)
    at org.hpms.gis.MongoDbTest.insert(MongoDbTest.java:63)
    at java.lang.Thread.run(Thread.java:748)

由以下代码引发:

     final UUID     id        = UUID.randomUUID();
     final double   frequency = 8_000.0 + ( 10_000.0 * Math.random() );
     final double   startSec  = 100*i;
     final double   startNano =  10*i;
     final double   endSec    = startSec  + ( 100*i );
     final double   endNano   = startNano + ( 10*i );
     final double   latitude  = ( 180.0*Math.random() ) -  90.0;
     final double   longitude = ( 360.0*Math.random() ) - 180.0;
     final Document trackID   = new Document(
        "id", new Document(
           "msb", id.getMostSignificantBits ()) .append(
           "lsb", id.getLeastSignificantBits()));
     final Document track = new Document(
        "id", new Document(
           "msb", id.getMostSignificantBits ()) .append(
           "lsb", id.getLeastSignificantBits())).append(
        "frequency", frequency    ) .append(
        "start", new Document(
           "seconds", startSec    ) .append(
           "nanoSec", startNano   )).append(
        "end", new Document(
           "seconds", endSec      ) .append(
           "nanoSec", endNano     )).append(
        "position", new Document(
           "latitude" , latitude  ) .append(
           "longitude", longitude )).append(
        "padding", new byte[1000-8-8-8-4-4-4-4-8-8] );
     //_collection.insertOne( track );
     _collection.updateOne(
        trackID,
        track,
        new UpdateOptions().upsert( true ));

注释的代码_collection.insertOne( track );执行正常。

为什么在“ upsert”不正确的情况下插入是正确的?


问题答案:

updateOne使用更新运算符更新文档字段。您需要replaceOne哪个带替换文件。

_collection.replaceOne(
        trackID,
        track,
        new UpdateOptions().upsert( true ));

这里更多

更新操作员:https : //docs.mongodb.com/manual/reference/operator/update-
field/

更新一:https
:
//docs.mongodb.com/manual/reference/method/db.collection.updateOne/

替换一个:https
:
//docs.mongodb.com/manual/reference/method/db.collection.replaceOne/



 类似资料:
  • 此例外情况: 由以下代码引发: 注释代码

  • 我在MongoDB文档模型上使用Azure CosmoDB,并且在使用DBRefs$id更新一些文档时遇到奇怪的行为 看看这个脚本示例: 然后返回: 如果有人知道发生了什么,我真的很感激。

  • 我在尝试使用后期映射更新对象时遇到以下异常: 原因:org.thymeleaf.exceptions。TemplateProcessingException:异常评估SpringEL表达式:“libro.id”(模板:“formulario-modificar-libros-p”-第18行,第15列) 原因:org.springframework.expression.spel。SpelEvalu

  • 我有以下代码: 出于某种原因,代码有时工作正常,有时则不正常,调试后我注意到当它不工作时,Datareader在其“HasRow”方法上有一个异常,特别是无效数字异常。我尝试直接在DBMS上运行结果查询,它执行得很好,有人知道为什么会发生这种异常吗?我错过了什么?。

  • BSON是在json基础上提出的新的数据形式,它就是直接把一个对象转化为二进制数字来表示。类似 Protocol Buffers BSON 已有多种编程语言的实现,详情请看 http://bsonspec.org/implementations.html MongoDB 关于 BSON 的 Java 实现请看 https://github.com/mongodb/mongo-java-driver

  • 我需要调用一个endpoint,它需要一个字段: 在我的测试中,我有以下代码: 不包含默认构造函数,所以为了避免这个问题,我创建了一个类,如下所示,以传递给: 问题是我仍然得到以下错误: 为什么它一直说我通过了一个抽象类?是一个类,而不是抽象类。 非常感谢。