title: MongoDb upsert exception invalid BSON field
body: <p>This exception:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>is thrown by the following code:</p>
  
  <pre><code>     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 ));
  </code></pre>
  
  <p>The commented code <code>_collection.insertOne( track );</code> executes fine.</p>
  
  <p><strong>Why the insert is fine when the "upsert" is not?</strong></p>