java – MongoDb upsert exception无效的BSON字段

前端之家收集整理的这篇文章主要介绍了java – MongoDb upsert exception无效的BSON字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个例外:
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",id.getLeastSignificantBits())).append(
        "frequency",frequency    ) .append(
        "start",new Document(
           "seconds",startSec    ) .append(
           "nanoSec",startNano   )).append(
        "end",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,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/

猜你在找的Java相关文章