code: public WriteResult update(final DBObject query, final DBObject update, final DBCollectionUpdateOptions options) {
          notNull("query", query);
          notNull("update", update);
          notNull("options", options);
          WriteConcern writeConcern = options.getWriteConcern() != null ? options.getWriteConcern() : getWriteConcern();
          com.mongodb.bulk.WriteRequest.Type updateType = !update.keySet().isEmpty() && update.keySet().iterator().next().startsWith("$")
                                                                  ? com.mongodb.bulk.WriteRequest.Type.UPDATE
                                                                  : com.mongodb.bulk.WriteRequest.Type.REPLACE;
          UpdateRequest updateRequest = new UpdateRequest(wrap(query), wrap(update, options.getEncoder()), updateType)
                                                .upsert(options.isUpsert()).multi(options.isMulti())
                                                .collation(options.getCollation())
                                                .arrayFilters(wrapAllowNull(options.getArrayFilters(), options.getEncoder()));
          return executeWriteOperation(new UpdateOperation(getNamespace(), true, writeConcern, retryWrites,
                  singletonList(updateRequest)).bypassDocumentValidation(options.getBypassDocumentValidation()));
      }
docs: Modify an existing document or documents in collection.
  
  @param query the selection criteria for the update
  @param update the modifications to apply
  @param options the options to apply to the update operation
  @return the result of the operation
  @throws com.mongodb.DuplicateKeyException if the write failed to a duplicate unique key
  @throws com.mongodb.WriteConcernException if the write failed due some other failure specific to the update command
  @throws MongoException if the operation failed for some other reason
  @mongodb.driver.manual tutorial/modify-documents/ Modify
  @since 3.4