code: @Procedure
      @Description("apoc.couchbase.upsert(hostOrKey, bucket, documentId, jsonDocument) yield id, expiry, cas, mutationToken, content - insert or overwrite a couchbase json document with its unique ID.")
      public Stream<CouchbaseJsonDocument> upsert(@Name("hostOrKey") String hostOrKey, @Name("bucket") String bucket,
                                                  @Name("documentId") String documentId, @Name("json") String json) {
          try (CouchbaseConnection couchbaseConnection = getCouchbaseConnection(hostOrKey, bucket)) {
              JsonDocument jsonDocument = couchbaseConnection.upsert(documentId, json);
              return jsonDocument == null ? Stream.empty() : Stream.of(new CouchbaseJsonDocument(jsonDocument));
          }
      }
docs: Insert or overwrite a {@link JsonDocument}.
  <p/>
  Example:
  <code>CALL apoc.couchbase.upsert('localhost', 'default', 'artist:vincent_van_gogh', '{"firstName":"Vincent","secondName":"Willem","lastName":"Van Gogh","notableWorks":["Starry Night","Sunflowers","Bedroom in Arles","Portrait of Dr Gachet","Sorrow"]}') yield id, expiry, cas, mutationToken, content</code>
  
  @param hostOrKey  a URI to use when connecting to the cluster reference or a configuration key
  @param bucket     the bucket to open; if null is passed then it's used the "default"
  bucket
  @param documentId the unique ID of the document
  @param json       the JSON String representing the document to store
  @return the newly created or overwritten {@link JsonDocument} or null in
  case of exception
  @see Bucket#upsert(Document)