diff --git a/.mvn/local-settings.xml b/.mvn/local-settings.xml
new file mode 100644
index 0000000000..b086635c4e
--- /dev/null
+++ b/.mvn/local-settings.xml
@@ -0,0 +1,12 @@
+
+    
+        
+            my-repository-http-unblocker
+            allanbank
+            
+            http://www.allanbank.com/repo/
+        
+    
+
diff --git a/.mvn/maven.config b/.mvn/maven.config
new file mode 100644
index 0000000000..d4c13b31ad
--- /dev/null
+++ b/.mvn/maven.config
@@ -0,0 +1 @@
+--settings=./.mvn/local-settings.xml
diff --git a/bin/ycsb b/bin/ycsb
index 0e0eb8f58c..0b3c099c03 100755
--- a/bin/ycsb
+++ b/bin/ycsb
@@ -103,7 +103,9 @@ DATABASES = {
     "solr7"        : "site.ycsb.db.solr7.SolrClient",
     "tarantool"    : "site.ycsb.db.TarantoolClient",
     "tablestore"   : "site.ycsb.db.tablestore.TableStoreClient",
-    "zookeeper"    : "site.ycsb.db.zookeeper.ZKClient"
+    "zookeeper"    : "site.ycsb.db.zookeeper.ZKClient",
+    "mongodb-modubft" : "site.ycsb.db.MongoDbModubftClient",
+    "redis-modubft"        : "site.ycsb.db.RedisModubftClient"
 }
 
 OPTIONS = {
@@ -216,7 +218,7 @@ def get_classpath_from_maven(module):
                                    "-am", "package", "-DskipTests",
                                    "dependency:build-classpath",
                                    "-DincludeScope=compile",
-                                   "-Dmdep.outputFilterFile=true"])
+                                   "-Dmdep.outputFilterFile=true", "-Dcheckstyle.skip"])
         # the above outputs a "classpath=/path/tojar:/path/to/other/jar" for each module
         # the last module will be the datastore binding
         line = [x for x in mvn_output.splitlines() if x.startswith("classpath=")][-1:]
diff --git a/copy_jars.sh b/copy_jars.sh
new file mode 100755
index 0000000000..5b42886257
--- /dev/null
+++ b/copy_jars.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+db=$1
+
+if [ -z $1 ]; then
+    echo "db - redis or mongodb not provided"
+    exit 1
+fi
+
+DEST_DIR="./jars/"
+mkdir -p "$DEST_DIR"
+
+if [ $1 = "redis"]; then
+    CLASSPATH="/home/snayyer/repos/non-work/studium/thesis/YCSB/redis/conf:/home/snayyer/repos/non-work/studium/thesis/YCSB/redis/target/redis-binding-0.18.0-SNAPSHOT.jar:/home/snayyer/.m2/repository/org/apache/htrace/htrace-core4/4.1.0-incubating/htrace-core4-4.1.0-incubating.jar:/home/snayyer/.m2/repository/com/google/protobuf/protobuf-java/3.19.6/protobuf-java-3.19.6.jar:/home/snayyer/.m2/repository/org/hdrhistogram/HdrHistogram/2.1.4/HdrHistogram-2.1.4.jar:/home/snayyer/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.4/jackson-mapper-asl-1.9.4.jar:/home/snayyer/.m2/repository/redis/clients/jedis/2.9.0/jedis-2.9.0.jar:/home/snayyer/.m2/repository/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2.jar:/home/snayyer/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.4/jackson-core-asl-1.9.4.jar:/home/snayyer/repos/non-work/studium/thesis/YCSB/core/target/core-0.18.0-SNAPSHOT.jar"
+elif [ $1 = "mongodb" ]; then
+    CLASSPATH="/home/snayyer/repos/non-work/studium/thesis/YCSB/mongodb/conf:/home/snayyer/repos/non-work/studium/thesis/YCSB/mongodb/target/mongodb-binding-0.18.0-SNAPSHOT.jar:/home/snayyer/.m2/repository/org/apache/htrace/htrace-core4/4.1.0-incubating/htrace-core4-4.1.0-incubating.jar:/home/snayyer/.m2/repository/com/google/protobuf/protobuf-java/3.19.6/protobuf-java-3.19.6.jar:/home/snayyer/.m2/repository/org/xerial/snappy/snappy-java/1.1.7.1/snappy-java-1.1.7.1.jar:/home/snayyer/.m2/repository/org/hdrhistogram/HdrHistogram/2.1.4/HdrHistogram-2.1.4.jar:/home/snayyer/.m2/repository/org/mongodb/mongo-java-driver/3.11.0/mongo-java-driver-3.11.0.jar:/home/snayyer/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.4/jackson-mapper-asl-1.9.4.jar:/home/snayyer/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.4/jackson-core-asl-1.9.4.jar:/home/snayyer/repos/non-work/studium/thesis/YCSB/core/target/core-0.18.0-SNAPSHOT.jar:/home/snayyer/.m2/repository/com/allanbank/mongodb-async-driver/2.0.1/mongodb-async-driver-2.0.1.jar"
+else
+    echo "Unknown db - neither redis nor mongodb"
+    exit 1
+fi
+
+IFS=':' read -ra JARS <<< "$CLASSPATH"
+for JAR in "${JARS[@]}"; do
+    if [ -e "$JAR" ]; then
+        cp "$JAR" "$DEST_DIR"
+    else
+        echo "Skipping $JAR as it does not exist."
+    fi
+done
+
+scp ./jars/* snayyer@zs01:/home/snayyer/YCSB/jars
\ No newline at end of file
diff --git a/core/src/main/java/site/ycsb/Client.java b/core/src/main/java/site/ycsb/Client.java
index bd96821170..c9f9037113 100644
--- a/core/src/main/java/site/ycsb/Client.java
+++ b/core/src/main/java/site/ycsb/Client.java
@@ -75,7 +75,7 @@ public static StringBuilder format(long seconds) {
  */
 public final class Client {
   private Client() {
-    //not used
+    // not used
   }
 
   public static final String DEFAULT_RECORD_COUNT = "0";
@@ -119,8 +119,10 @@ private Client() {
 
   /**
    * Indicates how many inserts to do if less than recordcount.
-   * Useful for partitioning the load among multiple servers if the client is the bottleneck.
-   * Additionally workloads should support the "insertstart" property which tells them which record to start at.
+   * Useful for partitioning the load among multiple servers if the client is the
+   * bottleneck.
+   * Additionally workloads should support the "insertstart" property which tells
+   * them which record to start at.
    */
   public static final String INSERT_COUNT_PROPERTY = "insertcount";
 
@@ -204,12 +206,12 @@ public static boolean checkRequiredProperties(Properties props) {
     return true;
   }
 
-
   /**
    * Exports the measurements to either sysout or a file using the exporter
    * loaded from conf.
    *
-   * @throws IOException Either failed to write to output stream or failed to close it.
+   * @throws IOException Either failed to write to output stream or failed to
+   *                     close it.
    */
   private static void exportMeasurements(Properties props, int opcount, long runtime)
       throws IOException {
@@ -282,12 +284,12 @@ public static void main(String[] args) {
 
     long maxExecutionTime = Integer.parseInt(props.getProperty(MAX_EXECUTION_TIME, "0"));
 
-    //get number of threads, target and db
+    // get number of threads, target and db
     int threadcount = Integer.parseInt(props.getProperty(THREAD_COUNT_PROPERTY, "1"));
     String dbname = props.getProperty(DB_PROPERTY, "site.ycsb.BasicDB");
     int target = Integer.parseInt(props.getProperty(TARGET_PROPERTY, "0"));
 
-    //compute the target throughput
+    // compute the target throughput
     double targetperthreadperms = -1;
     if (target > 0) {
       double targetperthread = ((double) target) / ((double) threadcount);
@@ -371,7 +373,8 @@ public static void main(String[] args) {
         if (status) {
           // wake up status thread if it's asleep
           statusthread.interrupt();
-          // at this point we assume all the monitored threads are already gone as per above join loop.
+          // at this point we assume all the monitored threads are already gone as per
+          // above join loop.
           try {
             statusthread.join();
           } catch (InterruptedException ignored) {
@@ -401,8 +404,8 @@ public static void main(String[] args) {
   }
 
   private static List initDb(String dbname, Properties props, int threadcount,
-                                           double targetperthreadperms, Workload workload, Tracer tracer,
-                                           CountDownLatch completeLatch) {
+      double targetperthreadperms, Workload workload, Tracer tracer,
+      CountDownLatch completeLatch) {
     boolean initFailed = false;
     boolean dotransactions = Boolean.valueOf(props.getProperty(DO_TRANSACTIONS_PROPERTY, String.valueOf(true)));
 
@@ -418,7 +421,7 @@ private static List initDb(String dbname, Properties props, int th
           opcount = Integer.parseInt(props.getProperty(RECORD_COUNT_PROPERTY, DEFAULT_RECORD_COUNT));
         }
       }
-      if (threadcount > opcount && opcount > 0){
+      if (threadcount > opcount && opcount > 0) {
         threadcount = opcount;
         System.out.println("Warning: the threadcount is bigger than recordcount, the threadcount will be recordcount!");
       }
@@ -426,6 +429,9 @@ private static List initDb(String dbname, Properties props, int th
         DB db;
         try {
           db = DBFactory.newDB(dbname, props, tracer);
+          Properties newProps = (Properties) props.clone();
+          newProps.setProperty("threadId", Integer.toString(threadid));
+          db.setProperties(newProps);
         } catch (UnknownDBException e) {
           System.out.println("Unknown DB " + dbname);
           initFailed = true;
@@ -434,7 +440,8 @@ private static List initDb(String dbname, Properties props, int th
 
         int threadopcount = opcount / threadcount;
 
-        // ensure correct number of operations, in case opcount is not a multiple of threadcount
+        // ensure correct number of operations, in case opcount is not a multiple of
+        // threadcount
         if (threadid < opcount % threadcount) {
           ++threadopcount;
         }
@@ -484,9 +491,10 @@ private static HTraceConfiguration getHTraceConfiguration(Properties props) {
   }
 
   private static Thread setupWarningThread() {
-    //show a warning message that creating the workload is taking a while
-    //but only do so if it is taking longer than 2 seconds
-    //(showing the message right away if the setup wasn't taking very long was confusing people)
+    // show a warning message that creating the workload is taking a while
+    // but only do so if it is taking longer than 2 seconds
+    // (showing the message right away if the setup wasn't taking very long was
+    // confusing people)
     return new Thread() {
       @Override
       public void run() {
@@ -610,7 +618,8 @@ private static Properties parseArguments(String[] args) {
           System.exit(0);
         }
 
-        //Issue #5 - remove call to stringPropertyNames to make compilable under Java 1.5
+        // Issue #5 - remove call to stringPropertyNames to make compilable under Java
+        // 1.5
         for (Enumeration e = myfileprops.propertyNames(); e.hasMoreElements();) {
           String prop = (String) e.nextElement();
 
@@ -658,9 +667,10 @@ private static Properties parseArguments(String[] args) {
       System.exit(0);
     }
 
-    //overwrite file properties with properties from the command line
+    // overwrite file properties with properties from the command line
 
-    //Issue #5 - remove call to stringPropertyNames to make compilable under Java 1.5
+    // Issue #5 - remove call to stringPropertyNames to make compilable under Java
+    // 1.5
     for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
       String prop = (String) e.nextElement();
 
diff --git a/mongodb/pom.xml b/mongodb/pom.xml
index 65bf0660a1..2363c6b08c 100644
--- a/mongodb/pom.xml
+++ b/mongodb/pom.xml
@@ -67,6 +67,12 @@ LICENSE file.
       jar
       compile
     
+
+    
+    com.google.protobuf
+    protobuf-java
+    3.19.6
+
   
   
     
diff --git a/mongodb/src/main/java/mongo/Mongo.java b/mongodb/src/main/java/mongo/Mongo.java
new file mode 100644
index 0000000000..eed62e6e4c
--- /dev/null
+++ b/mongodb/src/main/java/mongo/Mongo.java
@@ -0,0 +1,13499 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: mongo.proto
+
+package mongo;
+
+public final class Mongo {
+  private Mongo() {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+
+  public interface MongoRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.MongoRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * .mongo.MongoRequest.RequestType type = 1;
+     * 
+     * @return The enum numeric value on the wire for type.
+     */
+    int getTypeValue();
+
+    /**
+     * .mongo.MongoRequest.RequestType type = 1;
+     * 
+     * @return The type.
+     */
+    mongo.Mongo.MongoRequest.RequestType getType();
+
+    /**
+     * .mongo.CleanupRequest cleanup = 2;
+     * 
+     * @return Whether the cleanup field is set.
+     */
+    boolean hasCleanup();
+
+    /**
+     * .mongo.CleanupRequest cleanup = 2;
+     * 
+     * @return The cleanup.
+     */
+    mongo.Mongo.CleanupRequest getCleanup();
+
+    /**
+     * .mongo.CleanupRequest cleanup = 2;
+     */
+    mongo.Mongo.CleanupRequestOrBuilder getCleanupOrBuilder();
+
+    /**
+     * .mongo.DeleteRequest delete = 3;
+     * 
+     * @return Whether the delete field is set.
+     */
+    boolean hasDelete();
+
+    /**
+     * .mongo.DeleteRequest delete = 3;
+     * 
+     * @return The delete.
+     */
+    mongo.Mongo.DeleteRequest getDelete();
+
+    /**
+     * .mongo.DeleteRequest delete = 3;
+     */
+    mongo.Mongo.DeleteRequestOrBuilder getDeleteOrBuilder();
+
+    /**
+     * .mongo.InsertRequest insert = 4;
+     * 
+     * @return Whether the insert field is set.
+     */
+    boolean hasInsert();
+
+    /**
+     * .mongo.InsertRequest insert = 4;
+     * 
+     * @return The insert.
+     */
+    mongo.Mongo.InsertRequest getInsert();
+
+    /**
+     * .mongo.InsertRequest insert = 4;
+     */
+    mongo.Mongo.InsertRequestOrBuilder getInsertOrBuilder();
+
+    /**
+     * .mongo.ReadRequest read = 5;
+     * 
+     * @return Whether the read field is set.
+     */
+    boolean hasRead();
+
+    /**
+     * .mongo.ReadRequest read = 5;
+     * 
+     * @return The read.
+     */
+    mongo.Mongo.ReadRequest getRead();
+
+    /**
+     * .mongo.ReadRequest read = 5;
+     */
+    mongo.Mongo.ReadRequestOrBuilder getReadOrBuilder();
+
+    /**
+     * .mongo.ScanRequest scan = 6;
+     * 
+     * @return Whether the scan field is set.
+     */
+    boolean hasScan();
+
+    /**
+     * .mongo.ScanRequest scan = 6;
+     * 
+     * @return The scan.
+     */
+    mongo.Mongo.ScanRequest getScan();
+
+    /**
+     * .mongo.ScanRequest scan = 6;
+     */
+    mongo.Mongo.ScanRequestOrBuilder getScanOrBuilder();
+
+    /**
+     * .mongo.UpdateRequest update = 7;
+     * 
+     * @return Whether the update field is set.
+     */
+    boolean hasUpdate();
+
+    /**
+     * .mongo.UpdateRequest update = 7;
+     * 
+     * @return The update.
+     */
+    mongo.Mongo.UpdateRequest getUpdate();
+
+    /**
+     * .mongo.UpdateRequest update = 7;
+     */
+    mongo.Mongo.UpdateRequestOrBuilder getUpdateOrBuilder();
+
+    public mongo.Mongo.MongoRequest.RequestCase getRequestCase();
+  }
+
+  /**
+   * Protobuf type {@code mongo.MongoRequest}
+   */
+  public static final class MongoRequest extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.MongoRequest)
+      MongoRequestOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use MongoRequest.newBuilder() to construct.
+    private MongoRequest(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private MongoRequest() {
+      type_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MongoRequest();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_MongoRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_MongoRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.MongoRequest.class, mongo.Mongo.MongoRequest.Builder.class);
+    }
+
+    /**
+     * Protobuf enum {@code mongo.MongoRequest.RequestType}
+     */
+    public enum RequestType
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * CLEANUP = 0;
+       */
+      CLEANUP(0),
+      /**
+       * DELETE = 1;
+       */
+      DELETE(1),
+      /**
+       * INSERT = 2;
+       */
+      INSERT(2),
+      /**
+       * READ = 3;
+       */
+      READ(3),
+      /**
+       * SCAN = 4;
+       */
+      SCAN(4),
+      /**
+       * UPDATE = 5;
+       */
+      UPDATE(5),
+      UNRECOGNIZED(-1),
+      ;
+
+      /**
+       * CLEANUP = 0;
+       */
+      public static final int CLEANUP_VALUE = 0;
+      /**
+       * DELETE = 1;
+       */
+      public static final int DELETE_VALUE = 1;
+      /**
+       * INSERT = 2;
+       */
+      public static final int INSERT_VALUE = 2;
+      /**
+       * READ = 3;
+       */
+      public static final int READ_VALUE = 3;
+      /**
+       * SCAN = 4;
+       */
+      public static final int SCAN_VALUE = 4;
+      /**
+       * UPDATE = 5;
+       */
+      public static final int UPDATE_VALUE = 5;
+
+      public final int getNumber() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalArgumentException(
+              "Can't get the number of an unknown enum value.");
+        }
+        return value;
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static RequestType valueOf(int value) {
+        return forNumber(value);
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       */
+      public static RequestType forNumber(int value) {
+        switch (value) {
+          case 0:
+            return CLEANUP;
+          case 1:
+            return DELETE;
+          case 2:
+            return INSERT;
+          case 3:
+            return READ;
+          case 4:
+            return SCAN;
+          case 5:
+            return UPDATE;
+          default:
+            return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap internalGetValueMap() {
+        return internalValueMap;
+      }
+
+      private static final com.google.protobuf.Internal.EnumLiteMap internalValueMap = new com.google.protobuf.Internal.EnumLiteMap() {
+        public RequestType findValueByNumber(int number) {
+          return RequestType.forNumber(number);
+        }
+      };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalStateException(
+              "Can't get the descriptor of an unrecognized enum value.");
+        }
+        return getDescriptor().getValues().get(ordinal());
+      }
+
+      public final com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() {
+        return getDescriptor();
+      }
+
+      public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
+        return mongo.Mongo.MongoRequest.getDescriptor().getEnumTypes().get(0);
+      }
+
+      private static final RequestType[] VALUES = values();
+
+      public static RequestType valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+              "EnumValueDescriptor is not for this type.");
+        }
+        if (desc.getIndex() == -1) {
+          return UNRECOGNIZED;
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int value;
+
+      private RequestType(int value) {
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:mongo.MongoRequest.RequestType)
+    }
+
+    private int requestCase_ = 0;
+    private java.lang.Object request_;
+
+    public enum RequestCase
+        implements com.google.protobuf.Internal.EnumLite,
+        com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+      CLEANUP(2),
+      DELETE(3),
+      INSERT(4),
+      READ(5),
+      SCAN(6),
+      UPDATE(7),
+      REQUEST_NOT_SET(0);
+
+      private final int value;
+
+      private RequestCase(int value) {
+        this.value = value;
+      }
+
+      /**
+       * @param value The number of the enum to look for.
+       * @return The enum associated with the given number.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static RequestCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static RequestCase forNumber(int value) {
+        switch (value) {
+          case 2:
+            return CLEANUP;
+          case 3:
+            return DELETE;
+          case 4:
+            return INSERT;
+          case 5:
+            return READ;
+          case 6:
+            return SCAN;
+          case 7:
+            return UPDATE;
+          case 0:
+            return REQUEST_NOT_SET;
+          default:
+            return null;
+        }
+      }
+
+      public int getNumber() {
+        return this.value;
+      }
+    };
+
+    public RequestCase getRequestCase() {
+      return RequestCase.forNumber(
+          requestCase_);
+    }
+
+    public static final int TYPE_FIELD_NUMBER = 1;
+    private int type_;
+
+    /**
+     * .mongo.MongoRequest.RequestType type = 1;
+     * 
+     * @return The enum numeric value on the wire for type.
+     */
+    @java.lang.Override
+    public int getTypeValue() {
+      return type_;
+    }
+
+    /**
+     * .mongo.MongoRequest.RequestType type = 1;
+     * 
+     * @return The type.
+     */
+    @java.lang.Override
+    public mongo.Mongo.MongoRequest.RequestType getType() {
+      @SuppressWarnings("deprecation")
+      mongo.Mongo.MongoRequest.RequestType result = mongo.Mongo.MongoRequest.RequestType.valueOf(type_);
+      return result == null ? mongo.Mongo.MongoRequest.RequestType.UNRECOGNIZED : result;
+    }
+
+    public static final int CLEANUP_FIELD_NUMBER = 2;
+
+    /**
+     * .mongo.CleanupRequest cleanup = 2;
+     * 
+     * @return Whether the cleanup field is set.
+     */
+    @java.lang.Override
+    public boolean hasCleanup() {
+      return requestCase_ == 2;
+    }
+
+    /**
+     * .mongo.CleanupRequest cleanup = 2;
+     * 
+     * @return The cleanup.
+     */
+    @java.lang.Override
+    public mongo.Mongo.CleanupRequest getCleanup() {
+      if (requestCase_ == 2) {
+        return (mongo.Mongo.CleanupRequest) request_;
+      }
+      return mongo.Mongo.CleanupRequest.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.CleanupRequest cleanup = 2;
+     */
+    @java.lang.Override
+    public mongo.Mongo.CleanupRequestOrBuilder getCleanupOrBuilder() {
+      if (requestCase_ == 2) {
+        return (mongo.Mongo.CleanupRequest) request_;
+      }
+      return mongo.Mongo.CleanupRequest.getDefaultInstance();
+    }
+
+    public static final int DELETE_FIELD_NUMBER = 3;
+
+    /**
+     * .mongo.DeleteRequest delete = 3;
+     * 
+     * @return Whether the delete field is set.
+     */
+    @java.lang.Override
+    public boolean hasDelete() {
+      return requestCase_ == 3;
+    }
+
+    /**
+     * .mongo.DeleteRequest delete = 3;
+     * 
+     * @return The delete.
+     */
+    @java.lang.Override
+    public mongo.Mongo.DeleteRequest getDelete() {
+      if (requestCase_ == 3) {
+        return (mongo.Mongo.DeleteRequest) request_;
+      }
+      return mongo.Mongo.DeleteRequest.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.DeleteRequest delete = 3;
+     */
+    @java.lang.Override
+    public mongo.Mongo.DeleteRequestOrBuilder getDeleteOrBuilder() {
+      if (requestCase_ == 3) {
+        return (mongo.Mongo.DeleteRequest) request_;
+      }
+      return mongo.Mongo.DeleteRequest.getDefaultInstance();
+    }
+
+    public static final int INSERT_FIELD_NUMBER = 4;
+
+    /**
+     * .mongo.InsertRequest insert = 4;
+     * 
+     * @return Whether the insert field is set.
+     */
+    @java.lang.Override
+    public boolean hasInsert() {
+      return requestCase_ == 4;
+    }
+
+    /**
+     * .mongo.InsertRequest insert = 4;
+     * 
+     * @return The insert.
+     */
+    @java.lang.Override
+    public mongo.Mongo.InsertRequest getInsert() {
+      if (requestCase_ == 4) {
+        return (mongo.Mongo.InsertRequest) request_;
+      }
+      return mongo.Mongo.InsertRequest.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.InsertRequest insert = 4;
+     */
+    @java.lang.Override
+    public mongo.Mongo.InsertRequestOrBuilder getInsertOrBuilder() {
+      if (requestCase_ == 4) {
+        return (mongo.Mongo.InsertRequest) request_;
+      }
+      return mongo.Mongo.InsertRequest.getDefaultInstance();
+    }
+
+    public static final int READ_FIELD_NUMBER = 5;
+
+    /**
+     * .mongo.ReadRequest read = 5;
+     * 
+     * @return Whether the read field is set.
+     */
+    @java.lang.Override
+    public boolean hasRead() {
+      return requestCase_ == 5;
+    }
+
+    /**
+     * .mongo.ReadRequest read = 5;
+     * 
+     * @return The read.
+     */
+    @java.lang.Override
+    public mongo.Mongo.ReadRequest getRead() {
+      if (requestCase_ == 5) {
+        return (mongo.Mongo.ReadRequest) request_;
+      }
+      return mongo.Mongo.ReadRequest.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.ReadRequest read = 5;
+     */
+    @java.lang.Override
+    public mongo.Mongo.ReadRequestOrBuilder getReadOrBuilder() {
+      if (requestCase_ == 5) {
+        return (mongo.Mongo.ReadRequest) request_;
+      }
+      return mongo.Mongo.ReadRequest.getDefaultInstance();
+    }
+
+    public static final int SCAN_FIELD_NUMBER = 6;
+
+    /**
+     * .mongo.ScanRequest scan = 6;
+     * 
+     * @return Whether the scan field is set.
+     */
+    @java.lang.Override
+    public boolean hasScan() {
+      return requestCase_ == 6;
+    }
+
+    /**
+     * .mongo.ScanRequest scan = 6;
+     * 
+     * @return The scan.
+     */
+    @java.lang.Override
+    public mongo.Mongo.ScanRequest getScan() {
+      if (requestCase_ == 6) {
+        return (mongo.Mongo.ScanRequest) request_;
+      }
+      return mongo.Mongo.ScanRequest.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.ScanRequest scan = 6;
+     */
+    @java.lang.Override
+    public mongo.Mongo.ScanRequestOrBuilder getScanOrBuilder() {
+      if (requestCase_ == 6) {
+        return (mongo.Mongo.ScanRequest) request_;
+      }
+      return mongo.Mongo.ScanRequest.getDefaultInstance();
+    }
+
+    public static final int UPDATE_FIELD_NUMBER = 7;
+
+    /**
+     * .mongo.UpdateRequest update = 7;
+     * 
+     * @return Whether the update field is set.
+     */
+    @java.lang.Override
+    public boolean hasUpdate() {
+      return requestCase_ == 7;
+    }
+
+    /**
+     * .mongo.UpdateRequest update = 7;
+     * 
+     * @return The update.
+     */
+    @java.lang.Override
+    public mongo.Mongo.UpdateRequest getUpdate() {
+      if (requestCase_ == 7) {
+        return (mongo.Mongo.UpdateRequest) request_;
+      }
+      return mongo.Mongo.UpdateRequest.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.UpdateRequest update = 7;
+     */
+    @java.lang.Override
+    public mongo.Mongo.UpdateRequestOrBuilder getUpdateOrBuilder() {
+      if (requestCase_ == 7) {
+        return (mongo.Mongo.UpdateRequest) request_;
+      }
+      return mongo.Mongo.UpdateRequest.getDefaultInstance();
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (type_ != mongo.Mongo.MongoRequest.RequestType.CLEANUP.getNumber()) {
+        output.writeEnum(1, type_);
+      }
+      if (requestCase_ == 2) {
+        output.writeMessage(2, (mongo.Mongo.CleanupRequest) request_);
+      }
+      if (requestCase_ == 3) {
+        output.writeMessage(3, (mongo.Mongo.DeleteRequest) request_);
+      }
+      if (requestCase_ == 4) {
+        output.writeMessage(4, (mongo.Mongo.InsertRequest) request_);
+      }
+      if (requestCase_ == 5) {
+        output.writeMessage(5, (mongo.Mongo.ReadRequest) request_);
+      }
+      if (requestCase_ == 6) {
+        output.writeMessage(6, (mongo.Mongo.ScanRequest) request_);
+      }
+      if (requestCase_ == 7) {
+        output.writeMessage(7, (mongo.Mongo.UpdateRequest) request_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (type_ != mongo.Mongo.MongoRequest.RequestType.CLEANUP.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeEnumSize(1, type_);
+      }
+      if (requestCase_ == 2) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(2, (mongo.Mongo.CleanupRequest) request_);
+      }
+      if (requestCase_ == 3) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(3, (mongo.Mongo.DeleteRequest) request_);
+      }
+      if (requestCase_ == 4) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(4, (mongo.Mongo.InsertRequest) request_);
+      }
+      if (requestCase_ == 5) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(5, (mongo.Mongo.ReadRequest) request_);
+      }
+      if (requestCase_ == 6) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(6, (mongo.Mongo.ScanRequest) request_);
+      }
+      if (requestCase_ == 7) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(7, (mongo.Mongo.UpdateRequest) request_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.MongoRequest)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.MongoRequest other = (mongo.Mongo.MongoRequest) obj;
+
+      if (type_ != other.type_)
+        return false;
+      if (!getRequestCase().equals(other.getRequestCase()))
+        return false;
+      switch (requestCase_) {
+        case 2:
+          if (!getCleanup()
+              .equals(other.getCleanup()))
+            return false;
+          break;
+        case 3:
+          if (!getDelete()
+              .equals(other.getDelete()))
+            return false;
+          break;
+        case 4:
+          if (!getInsert()
+              .equals(other.getInsert()))
+            return false;
+          break;
+        case 5:
+          if (!getRead()
+              .equals(other.getRead()))
+            return false;
+          break;
+        case 6:
+          if (!getScan()
+              .equals(other.getScan()))
+            return false;
+          break;
+        case 7:
+          if (!getUpdate()
+              .equals(other.getUpdate()))
+            return false;
+          break;
+        case 0:
+        default:
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + type_;
+      switch (requestCase_) {
+        case 2:
+          hash = (37 * hash) + CLEANUP_FIELD_NUMBER;
+          hash = (53 * hash) + getCleanup().hashCode();
+          break;
+        case 3:
+          hash = (37 * hash) + DELETE_FIELD_NUMBER;
+          hash = (53 * hash) + getDelete().hashCode();
+          break;
+        case 4:
+          hash = (37 * hash) + INSERT_FIELD_NUMBER;
+          hash = (53 * hash) + getInsert().hashCode();
+          break;
+        case 5:
+          hash = (37 * hash) + READ_FIELD_NUMBER;
+          hash = (53 * hash) + getRead().hashCode();
+          break;
+        case 6:
+          hash = (37 * hash) + SCAN_FIELD_NUMBER;
+          hash = (53 * hash) + getScan().hashCode();
+          break;
+        case 7:
+          hash = (37 * hash) + UPDATE_FIELD_NUMBER;
+          hash = (53 * hash) + getUpdate().hashCode();
+          break;
+        case 0:
+        default:
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.MongoRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.MongoRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.MongoRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.MongoRequest}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.MongoRequest)
+        mongo.Mongo.MongoRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_MongoRequest_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_MongoRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.MongoRequest.class, mongo.Mongo.MongoRequest.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.MongoRequest.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        type_ = 0;
+
+        if (cleanupBuilder_ != null) {
+          cleanupBuilder_.clear();
+        }
+        if (deleteBuilder_ != null) {
+          deleteBuilder_.clear();
+        }
+        if (insertBuilder_ != null) {
+          insertBuilder_.clear();
+        }
+        if (readBuilder_ != null) {
+          readBuilder_.clear();
+        }
+        if (scanBuilder_ != null) {
+          scanBuilder_.clear();
+        }
+        if (updateBuilder_ != null) {
+          updateBuilder_.clear();
+        }
+        requestCase_ = 0;
+        request_ = null;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_MongoRequest_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.MongoRequest getDefaultInstanceForType() {
+        return mongo.Mongo.MongoRequest.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.MongoRequest build() {
+        mongo.Mongo.MongoRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.MongoRequest buildPartial() {
+        mongo.Mongo.MongoRequest result = new mongo.Mongo.MongoRequest(this);
+        result.type_ = type_;
+        if (requestCase_ == 2) {
+          if (cleanupBuilder_ == null) {
+            result.request_ = request_;
+          } else {
+            result.request_ = cleanupBuilder_.build();
+          }
+        }
+        if (requestCase_ == 3) {
+          if (deleteBuilder_ == null) {
+            result.request_ = request_;
+          } else {
+            result.request_ = deleteBuilder_.build();
+          }
+        }
+        if (requestCase_ == 4) {
+          if (insertBuilder_ == null) {
+            result.request_ = request_;
+          } else {
+            result.request_ = insertBuilder_.build();
+          }
+        }
+        if (requestCase_ == 5) {
+          if (readBuilder_ == null) {
+            result.request_ = request_;
+          } else {
+            result.request_ = readBuilder_.build();
+          }
+        }
+        if (requestCase_ == 6) {
+          if (scanBuilder_ == null) {
+            result.request_ = request_;
+          } else {
+            result.request_ = scanBuilder_.build();
+          }
+        }
+        if (requestCase_ == 7) {
+          if (updateBuilder_ == null) {
+            result.request_ = request_;
+          } else {
+            result.request_ = updateBuilder_.build();
+          }
+        }
+        result.requestCase_ = requestCase_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.MongoRequest) {
+          return mergeFrom((mongo.Mongo.MongoRequest) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.MongoRequest other) {
+        if (other == mongo.Mongo.MongoRequest.getDefaultInstance())
+          return this;
+        if (other.type_ != 0) {
+          setTypeValue(other.getTypeValue());
+        }
+        switch (other.getRequestCase()) {
+          case CLEANUP: {
+            mergeCleanup(other.getCleanup());
+            break;
+          }
+          case DELETE: {
+            mergeDelete(other.getDelete());
+            break;
+          }
+          case INSERT: {
+            mergeInsert(other.getInsert());
+            break;
+          }
+          case READ: {
+            mergeRead(other.getRead());
+            break;
+          }
+          case SCAN: {
+            mergeScan(other.getScan());
+            break;
+          }
+          case UPDATE: {
+            mergeUpdate(other.getUpdate());
+            break;
+          }
+          case REQUEST_NOT_SET: {
+            break;
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8: {
+                type_ = input.readEnum();
+
+                break;
+              } // case 8
+              case 18: {
+                input.readMessage(
+                    getCleanupFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                requestCase_ = 2;
+                break;
+              } // case 18
+              case 26: {
+                input.readMessage(
+                    getDeleteFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                requestCase_ = 3;
+                break;
+              } // case 26
+              case 34: {
+                input.readMessage(
+                    getInsertFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                requestCase_ = 4;
+                break;
+              } // case 34
+              case 42: {
+                input.readMessage(
+                    getReadFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                requestCase_ = 5;
+                break;
+              } // case 42
+              case 50: {
+                input.readMessage(
+                    getScanFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                requestCase_ = 6;
+                break;
+              } // case 50
+              case 58: {
+                input.readMessage(
+                    getUpdateFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                requestCase_ = 7;
+                break;
+              } // case 58
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int requestCase_ = 0;
+      private java.lang.Object request_;
+
+      public RequestCase getRequestCase() {
+        return RequestCase.forNumber(
+            requestCase_);
+      }
+
+      public Builder clearRequest() {
+        requestCase_ = 0;
+        request_ = null;
+        onChanged();
+        return this;
+      }
+
+      private int type_ = 0;
+
+      /**
+       * .mongo.MongoRequest.RequestType type = 1;
+       * 
+       * @return The enum numeric value on the wire for type.
+       */
+      @java.lang.Override
+      public int getTypeValue() {
+        return type_;
+      }
+
+      /**
+       * .mongo.MongoRequest.RequestType type = 1;
+       * 
+       * @param value The enum numeric value on the wire for type to set.
+       * @return This builder for chaining.
+       */
+      public Builder setTypeValue(int value) {
+
+        type_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * .mongo.MongoRequest.RequestType type = 1;
+       * 
+       * @return The type.
+       */
+      @java.lang.Override
+      public mongo.Mongo.MongoRequest.RequestType getType() {
+        @SuppressWarnings("deprecation")
+        mongo.Mongo.MongoRequest.RequestType result = mongo.Mongo.MongoRequest.RequestType.valueOf(type_);
+        return result == null ? mongo.Mongo.MongoRequest.RequestType.UNRECOGNIZED : result;
+      }
+
+      /**
+       * .mongo.MongoRequest.RequestType type = 1;
+       * 
+       * @param value The type to set.
+       * @return This builder for chaining.
+       */
+      public Builder setType(mongo.Mongo.MongoRequest.RequestType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        type_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * .mongo.MongoRequest.RequestType type = 1;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearType() {
+
+        type_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 cleanupBuilder_;
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       * 
+       * @return Whether the cleanup field is set.
+       */
+      @java.lang.Override
+      public boolean hasCleanup() {
+        return requestCase_ == 2;
+      }
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       * 
+       * @return The cleanup.
+       */
+      @java.lang.Override
+      public mongo.Mongo.CleanupRequest getCleanup() {
+        if (cleanupBuilder_ == null) {
+          if (requestCase_ == 2) {
+            return (mongo.Mongo.CleanupRequest) request_;
+          }
+          return mongo.Mongo.CleanupRequest.getDefaultInstance();
+        } else {
+          if (requestCase_ == 2) {
+            return cleanupBuilder_.getMessage();
+          }
+          return mongo.Mongo.CleanupRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       */
+      public Builder setCleanup(mongo.Mongo.CleanupRequest value) {
+        if (cleanupBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          request_ = value;
+          onChanged();
+        } else {
+          cleanupBuilder_.setMessage(value);
+        }
+        requestCase_ = 2;
+        return this;
+      }
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       */
+      public Builder setCleanup(
+          mongo.Mongo.CleanupRequest.Builder builderForValue) {
+        if (cleanupBuilder_ == null) {
+          request_ = builderForValue.build();
+          onChanged();
+        } else {
+          cleanupBuilder_.setMessage(builderForValue.build());
+        }
+        requestCase_ = 2;
+        return this;
+      }
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       */
+      public Builder mergeCleanup(mongo.Mongo.CleanupRequest value) {
+        if (cleanupBuilder_ == null) {
+          if (requestCase_ == 2 &&
+              request_ != mongo.Mongo.CleanupRequest.getDefaultInstance()) {
+            request_ = mongo.Mongo.CleanupRequest.newBuilder((mongo.Mongo.CleanupRequest) request_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            request_ = value;
+          }
+          onChanged();
+        } else {
+          if (requestCase_ == 2) {
+            cleanupBuilder_.mergeFrom(value);
+          }
+          cleanupBuilder_.setMessage(value);
+        }
+        requestCase_ = 2;
+        return this;
+      }
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       */
+      public Builder clearCleanup() {
+        if (cleanupBuilder_ == null) {
+          if (requestCase_ == 2) {
+            requestCase_ = 0;
+            request_ = null;
+            onChanged();
+          }
+        } else {
+          if (requestCase_ == 2) {
+            requestCase_ = 0;
+            request_ = null;
+          }
+          cleanupBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       */
+      public mongo.Mongo.CleanupRequest.Builder getCleanupBuilder() {
+        return getCleanupFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       */
+      @java.lang.Override
+      public mongo.Mongo.CleanupRequestOrBuilder getCleanupOrBuilder() {
+        if ((requestCase_ == 2) && (cleanupBuilder_ != null)) {
+          return cleanupBuilder_.getMessageOrBuilder();
+        } else {
+          if (requestCase_ == 2) {
+            return (mongo.Mongo.CleanupRequest) request_;
+          }
+          return mongo.Mongo.CleanupRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.CleanupRequest cleanup = 2;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getCleanupFieldBuilder() {
+        if (cleanupBuilder_ == null) {
+          if (!(requestCase_ == 2)) {
+            request_ = mongo.Mongo.CleanupRequest.getDefaultInstance();
+          }
+          cleanupBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.CleanupRequest) request_,
+              getParentForChildren(),
+              isClean());
+          request_ = null;
+        }
+        requestCase_ = 2;
+        onChanged();
+        ;
+        return cleanupBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 deleteBuilder_;
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       * 
+       * @return Whether the delete field is set.
+       */
+      @java.lang.Override
+      public boolean hasDelete() {
+        return requestCase_ == 3;
+      }
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       * 
+       * @return The delete.
+       */
+      @java.lang.Override
+      public mongo.Mongo.DeleteRequest getDelete() {
+        if (deleteBuilder_ == null) {
+          if (requestCase_ == 3) {
+            return (mongo.Mongo.DeleteRequest) request_;
+          }
+          return mongo.Mongo.DeleteRequest.getDefaultInstance();
+        } else {
+          if (requestCase_ == 3) {
+            return deleteBuilder_.getMessage();
+          }
+          return mongo.Mongo.DeleteRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       */
+      public Builder setDelete(mongo.Mongo.DeleteRequest value) {
+        if (deleteBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          request_ = value;
+          onChanged();
+        } else {
+          deleteBuilder_.setMessage(value);
+        }
+        requestCase_ = 3;
+        return this;
+      }
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       */
+      public Builder setDelete(
+          mongo.Mongo.DeleteRequest.Builder builderForValue) {
+        if (deleteBuilder_ == null) {
+          request_ = builderForValue.build();
+          onChanged();
+        } else {
+          deleteBuilder_.setMessage(builderForValue.build());
+        }
+        requestCase_ = 3;
+        return this;
+      }
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       */
+      public Builder mergeDelete(mongo.Mongo.DeleteRequest value) {
+        if (deleteBuilder_ == null) {
+          if (requestCase_ == 3 &&
+              request_ != mongo.Mongo.DeleteRequest.getDefaultInstance()) {
+            request_ = mongo.Mongo.DeleteRequest.newBuilder((mongo.Mongo.DeleteRequest) request_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            request_ = value;
+          }
+          onChanged();
+        } else {
+          if (requestCase_ == 3) {
+            deleteBuilder_.mergeFrom(value);
+          }
+          deleteBuilder_.setMessage(value);
+        }
+        requestCase_ = 3;
+        return this;
+      }
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       */
+      public Builder clearDelete() {
+        if (deleteBuilder_ == null) {
+          if (requestCase_ == 3) {
+            requestCase_ = 0;
+            request_ = null;
+            onChanged();
+          }
+        } else {
+          if (requestCase_ == 3) {
+            requestCase_ = 0;
+            request_ = null;
+          }
+          deleteBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       */
+      public mongo.Mongo.DeleteRequest.Builder getDeleteBuilder() {
+        return getDeleteFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       */
+      @java.lang.Override
+      public mongo.Mongo.DeleteRequestOrBuilder getDeleteOrBuilder() {
+        if ((requestCase_ == 3) && (deleteBuilder_ != null)) {
+          return deleteBuilder_.getMessageOrBuilder();
+        } else {
+          if (requestCase_ == 3) {
+            return (mongo.Mongo.DeleteRequest) request_;
+          }
+          return mongo.Mongo.DeleteRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.DeleteRequest delete = 3;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getDeleteFieldBuilder() {
+        if (deleteBuilder_ == null) {
+          if (!(requestCase_ == 3)) {
+            request_ = mongo.Mongo.DeleteRequest.getDefaultInstance();
+          }
+          deleteBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.DeleteRequest) request_,
+              getParentForChildren(),
+              isClean());
+          request_ = null;
+        }
+        requestCase_ = 3;
+        onChanged();
+        ;
+        return deleteBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 insertBuilder_;
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       * 
+       * @return Whether the insert field is set.
+       */
+      @java.lang.Override
+      public boolean hasInsert() {
+        return requestCase_ == 4;
+      }
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       * 
+       * @return The insert.
+       */
+      @java.lang.Override
+      public mongo.Mongo.InsertRequest getInsert() {
+        if (insertBuilder_ == null) {
+          if (requestCase_ == 4) {
+            return (mongo.Mongo.InsertRequest) request_;
+          }
+          return mongo.Mongo.InsertRequest.getDefaultInstance();
+        } else {
+          if (requestCase_ == 4) {
+            return insertBuilder_.getMessage();
+          }
+          return mongo.Mongo.InsertRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       */
+      public Builder setInsert(mongo.Mongo.InsertRequest value) {
+        if (insertBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          request_ = value;
+          onChanged();
+        } else {
+          insertBuilder_.setMessage(value);
+        }
+        requestCase_ = 4;
+        return this;
+      }
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       */
+      public Builder setInsert(
+          mongo.Mongo.InsertRequest.Builder builderForValue) {
+        if (insertBuilder_ == null) {
+          request_ = builderForValue.build();
+          onChanged();
+        } else {
+          insertBuilder_.setMessage(builderForValue.build());
+        }
+        requestCase_ = 4;
+        return this;
+      }
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       */
+      public Builder mergeInsert(mongo.Mongo.InsertRequest value) {
+        if (insertBuilder_ == null) {
+          if (requestCase_ == 4 &&
+              request_ != mongo.Mongo.InsertRequest.getDefaultInstance()) {
+            request_ = mongo.Mongo.InsertRequest.newBuilder((mongo.Mongo.InsertRequest) request_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            request_ = value;
+          }
+          onChanged();
+        } else {
+          if (requestCase_ == 4) {
+            insertBuilder_.mergeFrom(value);
+          }
+          insertBuilder_.setMessage(value);
+        }
+        requestCase_ = 4;
+        return this;
+      }
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       */
+      public Builder clearInsert() {
+        if (insertBuilder_ == null) {
+          if (requestCase_ == 4) {
+            requestCase_ = 0;
+            request_ = null;
+            onChanged();
+          }
+        } else {
+          if (requestCase_ == 4) {
+            requestCase_ = 0;
+            request_ = null;
+          }
+          insertBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       */
+      public mongo.Mongo.InsertRequest.Builder getInsertBuilder() {
+        return getInsertFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       */
+      @java.lang.Override
+      public mongo.Mongo.InsertRequestOrBuilder getInsertOrBuilder() {
+        if ((requestCase_ == 4) && (insertBuilder_ != null)) {
+          return insertBuilder_.getMessageOrBuilder();
+        } else {
+          if (requestCase_ == 4) {
+            return (mongo.Mongo.InsertRequest) request_;
+          }
+          return mongo.Mongo.InsertRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.InsertRequest insert = 4;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getInsertFieldBuilder() {
+        if (insertBuilder_ == null) {
+          if (!(requestCase_ == 4)) {
+            request_ = mongo.Mongo.InsertRequest.getDefaultInstance();
+          }
+          insertBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.InsertRequest) request_,
+              getParentForChildren(),
+              isClean());
+          request_ = null;
+        }
+        requestCase_ = 4;
+        onChanged();
+        ;
+        return insertBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 readBuilder_;
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       * 
+       * @return Whether the read field is set.
+       */
+      @java.lang.Override
+      public boolean hasRead() {
+        return requestCase_ == 5;
+      }
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       * 
+       * @return The read.
+       */
+      @java.lang.Override
+      public mongo.Mongo.ReadRequest getRead() {
+        if (readBuilder_ == null) {
+          if (requestCase_ == 5) {
+            return (mongo.Mongo.ReadRequest) request_;
+          }
+          return mongo.Mongo.ReadRequest.getDefaultInstance();
+        } else {
+          if (requestCase_ == 5) {
+            return readBuilder_.getMessage();
+          }
+          return mongo.Mongo.ReadRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       */
+      public Builder setRead(mongo.Mongo.ReadRequest value) {
+        if (readBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          request_ = value;
+          onChanged();
+        } else {
+          readBuilder_.setMessage(value);
+        }
+        requestCase_ = 5;
+        return this;
+      }
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       */
+      public Builder setRead(
+          mongo.Mongo.ReadRequest.Builder builderForValue) {
+        if (readBuilder_ == null) {
+          request_ = builderForValue.build();
+          onChanged();
+        } else {
+          readBuilder_.setMessage(builderForValue.build());
+        }
+        requestCase_ = 5;
+        return this;
+      }
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       */
+      public Builder mergeRead(mongo.Mongo.ReadRequest value) {
+        if (readBuilder_ == null) {
+          if (requestCase_ == 5 &&
+              request_ != mongo.Mongo.ReadRequest.getDefaultInstance()) {
+            request_ = mongo.Mongo.ReadRequest.newBuilder((mongo.Mongo.ReadRequest) request_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            request_ = value;
+          }
+          onChanged();
+        } else {
+          if (requestCase_ == 5) {
+            readBuilder_.mergeFrom(value);
+          }
+          readBuilder_.setMessage(value);
+        }
+        requestCase_ = 5;
+        return this;
+      }
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       */
+      public Builder clearRead() {
+        if (readBuilder_ == null) {
+          if (requestCase_ == 5) {
+            requestCase_ = 0;
+            request_ = null;
+            onChanged();
+          }
+        } else {
+          if (requestCase_ == 5) {
+            requestCase_ = 0;
+            request_ = null;
+          }
+          readBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       */
+      public mongo.Mongo.ReadRequest.Builder getReadBuilder() {
+        return getReadFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       */
+      @java.lang.Override
+      public mongo.Mongo.ReadRequestOrBuilder getReadOrBuilder() {
+        if ((requestCase_ == 5) && (readBuilder_ != null)) {
+          return readBuilder_.getMessageOrBuilder();
+        } else {
+          if (requestCase_ == 5) {
+            return (mongo.Mongo.ReadRequest) request_;
+          }
+          return mongo.Mongo.ReadRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.ReadRequest read = 5;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getReadFieldBuilder() {
+        if (readBuilder_ == null) {
+          if (!(requestCase_ == 5)) {
+            request_ = mongo.Mongo.ReadRequest.getDefaultInstance();
+          }
+          readBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.ReadRequest) request_,
+              getParentForChildren(),
+              isClean());
+          request_ = null;
+        }
+        requestCase_ = 5;
+        onChanged();
+        ;
+        return readBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 scanBuilder_;
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       * 
+       * @return Whether the scan field is set.
+       */
+      @java.lang.Override
+      public boolean hasScan() {
+        return requestCase_ == 6;
+      }
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       * 
+       * @return The scan.
+       */
+      @java.lang.Override
+      public mongo.Mongo.ScanRequest getScan() {
+        if (scanBuilder_ == null) {
+          if (requestCase_ == 6) {
+            return (mongo.Mongo.ScanRequest) request_;
+          }
+          return mongo.Mongo.ScanRequest.getDefaultInstance();
+        } else {
+          if (requestCase_ == 6) {
+            return scanBuilder_.getMessage();
+          }
+          return mongo.Mongo.ScanRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       */
+      public Builder setScan(mongo.Mongo.ScanRequest value) {
+        if (scanBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          request_ = value;
+          onChanged();
+        } else {
+          scanBuilder_.setMessage(value);
+        }
+        requestCase_ = 6;
+        return this;
+      }
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       */
+      public Builder setScan(
+          mongo.Mongo.ScanRequest.Builder builderForValue) {
+        if (scanBuilder_ == null) {
+          request_ = builderForValue.build();
+          onChanged();
+        } else {
+          scanBuilder_.setMessage(builderForValue.build());
+        }
+        requestCase_ = 6;
+        return this;
+      }
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       */
+      public Builder mergeScan(mongo.Mongo.ScanRequest value) {
+        if (scanBuilder_ == null) {
+          if (requestCase_ == 6 &&
+              request_ != mongo.Mongo.ScanRequest.getDefaultInstance()) {
+            request_ = mongo.Mongo.ScanRequest.newBuilder((mongo.Mongo.ScanRequest) request_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            request_ = value;
+          }
+          onChanged();
+        } else {
+          if (requestCase_ == 6) {
+            scanBuilder_.mergeFrom(value);
+          }
+          scanBuilder_.setMessage(value);
+        }
+        requestCase_ = 6;
+        return this;
+      }
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       */
+      public Builder clearScan() {
+        if (scanBuilder_ == null) {
+          if (requestCase_ == 6) {
+            requestCase_ = 0;
+            request_ = null;
+            onChanged();
+          }
+        } else {
+          if (requestCase_ == 6) {
+            requestCase_ = 0;
+            request_ = null;
+          }
+          scanBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       */
+      public mongo.Mongo.ScanRequest.Builder getScanBuilder() {
+        return getScanFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       */
+      @java.lang.Override
+      public mongo.Mongo.ScanRequestOrBuilder getScanOrBuilder() {
+        if ((requestCase_ == 6) && (scanBuilder_ != null)) {
+          return scanBuilder_.getMessageOrBuilder();
+        } else {
+          if (requestCase_ == 6) {
+            return (mongo.Mongo.ScanRequest) request_;
+          }
+          return mongo.Mongo.ScanRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.ScanRequest scan = 6;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getScanFieldBuilder() {
+        if (scanBuilder_ == null) {
+          if (!(requestCase_ == 6)) {
+            request_ = mongo.Mongo.ScanRequest.getDefaultInstance();
+          }
+          scanBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.ScanRequest) request_,
+              getParentForChildren(),
+              isClean());
+          request_ = null;
+        }
+        requestCase_ = 6;
+        onChanged();
+        ;
+        return scanBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 updateBuilder_;
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       * 
+       * @return Whether the update field is set.
+       */
+      @java.lang.Override
+      public boolean hasUpdate() {
+        return requestCase_ == 7;
+      }
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       * 
+       * @return The update.
+       */
+      @java.lang.Override
+      public mongo.Mongo.UpdateRequest getUpdate() {
+        if (updateBuilder_ == null) {
+          if (requestCase_ == 7) {
+            return (mongo.Mongo.UpdateRequest) request_;
+          }
+          return mongo.Mongo.UpdateRequest.getDefaultInstance();
+        } else {
+          if (requestCase_ == 7) {
+            return updateBuilder_.getMessage();
+          }
+          return mongo.Mongo.UpdateRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       */
+      public Builder setUpdate(mongo.Mongo.UpdateRequest value) {
+        if (updateBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          request_ = value;
+          onChanged();
+        } else {
+          updateBuilder_.setMessage(value);
+        }
+        requestCase_ = 7;
+        return this;
+      }
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       */
+      public Builder setUpdate(
+          mongo.Mongo.UpdateRequest.Builder builderForValue) {
+        if (updateBuilder_ == null) {
+          request_ = builderForValue.build();
+          onChanged();
+        } else {
+          updateBuilder_.setMessage(builderForValue.build());
+        }
+        requestCase_ = 7;
+        return this;
+      }
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       */
+      public Builder mergeUpdate(mongo.Mongo.UpdateRequest value) {
+        if (updateBuilder_ == null) {
+          if (requestCase_ == 7 &&
+              request_ != mongo.Mongo.UpdateRequest.getDefaultInstance()) {
+            request_ = mongo.Mongo.UpdateRequest.newBuilder((mongo.Mongo.UpdateRequest) request_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            request_ = value;
+          }
+          onChanged();
+        } else {
+          if (requestCase_ == 7) {
+            updateBuilder_.mergeFrom(value);
+          }
+          updateBuilder_.setMessage(value);
+        }
+        requestCase_ = 7;
+        return this;
+      }
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       */
+      public Builder clearUpdate() {
+        if (updateBuilder_ == null) {
+          if (requestCase_ == 7) {
+            requestCase_ = 0;
+            request_ = null;
+            onChanged();
+          }
+        } else {
+          if (requestCase_ == 7) {
+            requestCase_ = 0;
+            request_ = null;
+          }
+          updateBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       */
+      public mongo.Mongo.UpdateRequest.Builder getUpdateBuilder() {
+        return getUpdateFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       */
+      @java.lang.Override
+      public mongo.Mongo.UpdateRequestOrBuilder getUpdateOrBuilder() {
+        if ((requestCase_ == 7) && (updateBuilder_ != null)) {
+          return updateBuilder_.getMessageOrBuilder();
+        } else {
+          if (requestCase_ == 7) {
+            return (mongo.Mongo.UpdateRequest) request_;
+          }
+          return mongo.Mongo.UpdateRequest.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.UpdateRequest update = 7;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getUpdateFieldBuilder() {
+        if (updateBuilder_ == null) {
+          if (!(requestCase_ == 7)) {
+            request_ = mongo.Mongo.UpdateRequest.getDefaultInstance();
+          }
+          updateBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.UpdateRequest) request_,
+              getParentForChildren(),
+              isClean());
+          request_ = null;
+        }
+        requestCase_ = 7;
+        onChanged();
+        ;
+        return updateBuilder_;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.MongoRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.MongoRequest)
+    private static final mongo.Mongo.MongoRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.MongoRequest();
+    }
+
+    public static mongo.Mongo.MongoRequest getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public MongoRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.MongoRequest getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MongoResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.MongoResponse)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * .mongo.MongoResponse.Status status = 1;
+     * 
+     * @return The enum numeric value on the wire for status.
+     */
+    int getStatusValue();
+
+    /**
+     * .mongo.MongoResponse.Status status = 1;
+     * 
+     * @return The status.
+     */
+    mongo.Mongo.MongoResponse.Status getStatus();
+
+    /**
+     * .mongo.CleanupResponse cleanup = 2;
+     * 
+     * @return Whether the cleanup field is set.
+     */
+    boolean hasCleanup();
+
+    /**
+     * .mongo.CleanupResponse cleanup = 2;
+     * 
+     * @return The cleanup.
+     */
+    mongo.Mongo.CleanupResponse getCleanup();
+
+    /**
+     * .mongo.CleanupResponse cleanup = 2;
+     */
+    mongo.Mongo.CleanupResponseOrBuilder getCleanupOrBuilder();
+
+    /**
+     * .mongo.DeleteResponse delete = 3;
+     * 
+     * @return Whether the delete field is set.
+     */
+    boolean hasDelete();
+
+    /**
+     * .mongo.DeleteResponse delete = 3;
+     * 
+     * @return The delete.
+     */
+    mongo.Mongo.DeleteResponse getDelete();
+
+    /**
+     * .mongo.DeleteResponse delete = 3;
+     */
+    mongo.Mongo.DeleteResponseOrBuilder getDeleteOrBuilder();
+
+    /**
+     * .mongo.InsertResponse insert = 4;
+     * 
+     * @return Whether the insert field is set.
+     */
+    boolean hasInsert();
+
+    /**
+     * .mongo.InsertResponse insert = 4;
+     * 
+     * @return The insert.
+     */
+    mongo.Mongo.InsertResponse getInsert();
+
+    /**
+     * .mongo.InsertResponse insert = 4;
+     */
+    mongo.Mongo.InsertResponseOrBuilder getInsertOrBuilder();
+
+    /**
+     * .mongo.ReadResponse read = 5;
+     * 
+     * @return Whether the read field is set.
+     */
+    boolean hasRead();
+
+    /**
+     * .mongo.ReadResponse read = 5;
+     * 
+     * @return The read.
+     */
+    mongo.Mongo.ReadResponse getRead();
+
+    /**
+     * .mongo.ReadResponse read = 5;
+     */
+    mongo.Mongo.ReadResponseOrBuilder getReadOrBuilder();
+
+    /**
+     * .mongo.ScanResponse scan = 6;
+     * 
+     * @return Whether the scan field is set.
+     */
+    boolean hasScan();
+
+    /**
+     * .mongo.ScanResponse scan = 6;
+     * 
+     * @return The scan.
+     */
+    mongo.Mongo.ScanResponse getScan();
+
+    /**
+     * .mongo.ScanResponse scan = 6;
+     */
+    mongo.Mongo.ScanResponseOrBuilder getScanOrBuilder();
+
+    /**
+     * .mongo.UpdateResponse update = 7;
+     * 
+     * @return Whether the update field is set.
+     */
+    boolean hasUpdate();
+
+    /**
+     * .mongo.UpdateResponse update = 7;
+     * 
+     * @return The update.
+     */
+    mongo.Mongo.UpdateResponse getUpdate();
+
+    /**
+     * .mongo.UpdateResponse update = 7;
+     */
+    mongo.Mongo.UpdateResponseOrBuilder getUpdateOrBuilder();
+
+    public mongo.Mongo.MongoResponse.ResponseCase getResponseCase();
+  }
+
+  /**
+   * Protobuf type {@code mongo.MongoResponse}
+   */
+  public static final class MongoResponse extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.MongoResponse)
+      MongoResponseOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use MongoResponse.newBuilder() to construct.
+    private MongoResponse(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private MongoResponse() {
+      status_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MongoResponse();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_MongoResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_MongoResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.MongoResponse.class, mongo.Mongo.MongoResponse.Builder.class);
+    }
+
+    /**
+     * Protobuf enum {@code mongo.MongoResponse.Status}
+     */
+    public enum Status
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * OK = 0;
+       */
+      OK(0),
+      /**
+       * ERROR = 1;
+       */
+      ERROR(1),
+      /**
+       * NOT_FOUND = 2;
+       */
+      NOT_FOUND(2),
+      /**
+       * BATCHED_OK = 3;
+       */
+      BATCHED_OK(3),
+      UNRECOGNIZED(-1),
+      ;
+
+      /**
+       * OK = 0;
+       */
+      public static final int OK_VALUE = 0;
+      /**
+       * ERROR = 1;
+       */
+      public static final int ERROR_VALUE = 1;
+      /**
+       * NOT_FOUND = 2;
+       */
+      public static final int NOT_FOUND_VALUE = 2;
+      /**
+       * BATCHED_OK = 3;
+       */
+      public static final int BATCHED_OK_VALUE = 3;
+
+      public final int getNumber() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalArgumentException(
+              "Can't get the number of an unknown enum value.");
+        }
+        return value;
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static Status valueOf(int value) {
+        return forNumber(value);
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       */
+      public static Status forNumber(int value) {
+        switch (value) {
+          case 0:
+            return OK;
+          case 1:
+            return ERROR;
+          case 2:
+            return NOT_FOUND;
+          case 3:
+            return BATCHED_OK;
+          default:
+            return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap internalGetValueMap() {
+        return internalValueMap;
+      }
+
+      private static final com.google.protobuf.Internal.EnumLiteMap internalValueMap = new com.google.protobuf.Internal.EnumLiteMap() {
+        public Status findValueByNumber(int number) {
+          return Status.forNumber(number);
+        }
+      };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalStateException(
+              "Can't get the descriptor of an unrecognized enum value.");
+        }
+        return getDescriptor().getValues().get(ordinal());
+      }
+
+      public final com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() {
+        return getDescriptor();
+      }
+
+      public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
+        return mongo.Mongo.MongoResponse.getDescriptor().getEnumTypes().get(0);
+      }
+
+      private static final Status[] VALUES = values();
+
+      public static Status valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+              "EnumValueDescriptor is not for this type.");
+        }
+        if (desc.getIndex() == -1) {
+          return UNRECOGNIZED;
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int value;
+
+      private Status(int value) {
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:mongo.MongoResponse.Status)
+    }
+
+    private int responseCase_ = 0;
+    private java.lang.Object response_;
+
+    public enum ResponseCase
+        implements com.google.protobuf.Internal.EnumLite,
+        com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+      CLEANUP(2),
+      DELETE(3),
+      INSERT(4),
+      READ(5),
+      SCAN(6),
+      UPDATE(7),
+      RESPONSE_NOT_SET(0);
+
+      private final int value;
+
+      private ResponseCase(int value) {
+        this.value = value;
+      }
+
+      /**
+       * @param value The number of the enum to look for.
+       * @return The enum associated with the given number.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static ResponseCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static ResponseCase forNumber(int value) {
+        switch (value) {
+          case 2:
+            return CLEANUP;
+          case 3:
+            return DELETE;
+          case 4:
+            return INSERT;
+          case 5:
+            return READ;
+          case 6:
+            return SCAN;
+          case 7:
+            return UPDATE;
+          case 0:
+            return RESPONSE_NOT_SET;
+          default:
+            return null;
+        }
+      }
+
+      public int getNumber() {
+        return this.value;
+      }
+    };
+
+    public ResponseCase getResponseCase() {
+      return ResponseCase.forNumber(
+          responseCase_);
+    }
+
+    public static final int STATUS_FIELD_NUMBER = 1;
+    private int status_;
+
+    /**
+     * .mongo.MongoResponse.Status status = 1;
+     * 
+     * @return The enum numeric value on the wire for status.
+     */
+    @java.lang.Override
+    public int getStatusValue() {
+      return status_;
+    }
+
+    /**
+     * .mongo.MongoResponse.Status status = 1;
+     * 
+     * @return The status.
+     */
+    @java.lang.Override
+    public mongo.Mongo.MongoResponse.Status getStatus() {
+      @SuppressWarnings("deprecation")
+      mongo.Mongo.MongoResponse.Status result = mongo.Mongo.MongoResponse.Status.valueOf(status_);
+      return result == null ? mongo.Mongo.MongoResponse.Status.UNRECOGNIZED : result;
+    }
+
+    public static final int CLEANUP_FIELD_NUMBER = 2;
+
+    /**
+     * .mongo.CleanupResponse cleanup = 2;
+     * 
+     * @return Whether the cleanup field is set.
+     */
+    @java.lang.Override
+    public boolean hasCleanup() {
+      return responseCase_ == 2;
+    }
+
+    /**
+     * .mongo.CleanupResponse cleanup = 2;
+     * 
+     * @return The cleanup.
+     */
+    @java.lang.Override
+    public mongo.Mongo.CleanupResponse getCleanup() {
+      if (responseCase_ == 2) {
+        return (mongo.Mongo.CleanupResponse) response_;
+      }
+      return mongo.Mongo.CleanupResponse.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.CleanupResponse cleanup = 2;
+     */
+    @java.lang.Override
+    public mongo.Mongo.CleanupResponseOrBuilder getCleanupOrBuilder() {
+      if (responseCase_ == 2) {
+        return (mongo.Mongo.CleanupResponse) response_;
+      }
+      return mongo.Mongo.CleanupResponse.getDefaultInstance();
+    }
+
+    public static final int DELETE_FIELD_NUMBER = 3;
+
+    /**
+     * .mongo.DeleteResponse delete = 3;
+     * 
+     * @return Whether the delete field is set.
+     */
+    @java.lang.Override
+    public boolean hasDelete() {
+      return responseCase_ == 3;
+    }
+
+    /**
+     * .mongo.DeleteResponse delete = 3;
+     * 
+     * @return The delete.
+     */
+    @java.lang.Override
+    public mongo.Mongo.DeleteResponse getDelete() {
+      if (responseCase_ == 3) {
+        return (mongo.Mongo.DeleteResponse) response_;
+      }
+      return mongo.Mongo.DeleteResponse.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.DeleteResponse delete = 3;
+     */
+    @java.lang.Override
+    public mongo.Mongo.DeleteResponseOrBuilder getDeleteOrBuilder() {
+      if (responseCase_ == 3) {
+        return (mongo.Mongo.DeleteResponse) response_;
+      }
+      return mongo.Mongo.DeleteResponse.getDefaultInstance();
+    }
+
+    public static final int INSERT_FIELD_NUMBER = 4;
+
+    /**
+     * .mongo.InsertResponse insert = 4;
+     * 
+     * @return Whether the insert field is set.
+     */
+    @java.lang.Override
+    public boolean hasInsert() {
+      return responseCase_ == 4;
+    }
+
+    /**
+     * .mongo.InsertResponse insert = 4;
+     * 
+     * @return The insert.
+     */
+    @java.lang.Override
+    public mongo.Mongo.InsertResponse getInsert() {
+      if (responseCase_ == 4) {
+        return (mongo.Mongo.InsertResponse) response_;
+      }
+      return mongo.Mongo.InsertResponse.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.InsertResponse insert = 4;
+     */
+    @java.lang.Override
+    public mongo.Mongo.InsertResponseOrBuilder getInsertOrBuilder() {
+      if (responseCase_ == 4) {
+        return (mongo.Mongo.InsertResponse) response_;
+      }
+      return mongo.Mongo.InsertResponse.getDefaultInstance();
+    }
+
+    public static final int READ_FIELD_NUMBER = 5;
+
+    /**
+     * .mongo.ReadResponse read = 5;
+     * 
+     * @return Whether the read field is set.
+     */
+    @java.lang.Override
+    public boolean hasRead() {
+      return responseCase_ == 5;
+    }
+
+    /**
+     * .mongo.ReadResponse read = 5;
+     * 
+     * @return The read.
+     */
+    @java.lang.Override
+    public mongo.Mongo.ReadResponse getRead() {
+      if (responseCase_ == 5) {
+        return (mongo.Mongo.ReadResponse) response_;
+      }
+      return mongo.Mongo.ReadResponse.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.ReadResponse read = 5;
+     */
+    @java.lang.Override
+    public mongo.Mongo.ReadResponseOrBuilder getReadOrBuilder() {
+      if (responseCase_ == 5) {
+        return (mongo.Mongo.ReadResponse) response_;
+      }
+      return mongo.Mongo.ReadResponse.getDefaultInstance();
+    }
+
+    public static final int SCAN_FIELD_NUMBER = 6;
+
+    /**
+     * .mongo.ScanResponse scan = 6;
+     * 
+     * @return Whether the scan field is set.
+     */
+    @java.lang.Override
+    public boolean hasScan() {
+      return responseCase_ == 6;
+    }
+
+    /**
+     * .mongo.ScanResponse scan = 6;
+     * 
+     * @return The scan.
+     */
+    @java.lang.Override
+    public mongo.Mongo.ScanResponse getScan() {
+      if (responseCase_ == 6) {
+        return (mongo.Mongo.ScanResponse) response_;
+      }
+      return mongo.Mongo.ScanResponse.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.ScanResponse scan = 6;
+     */
+    @java.lang.Override
+    public mongo.Mongo.ScanResponseOrBuilder getScanOrBuilder() {
+      if (responseCase_ == 6) {
+        return (mongo.Mongo.ScanResponse) response_;
+      }
+      return mongo.Mongo.ScanResponse.getDefaultInstance();
+    }
+
+    public static final int UPDATE_FIELD_NUMBER = 7;
+
+    /**
+     * .mongo.UpdateResponse update = 7;
+     * 
+     * @return Whether the update field is set.
+     */
+    @java.lang.Override
+    public boolean hasUpdate() {
+      return responseCase_ == 7;
+    }
+
+    /**
+     * .mongo.UpdateResponse update = 7;
+     * 
+     * @return The update.
+     */
+    @java.lang.Override
+    public mongo.Mongo.UpdateResponse getUpdate() {
+      if (responseCase_ == 7) {
+        return (mongo.Mongo.UpdateResponse) response_;
+      }
+      return mongo.Mongo.UpdateResponse.getDefaultInstance();
+    }
+
+    /**
+     * .mongo.UpdateResponse update = 7;
+     */
+    @java.lang.Override
+    public mongo.Mongo.UpdateResponseOrBuilder getUpdateOrBuilder() {
+      if (responseCase_ == 7) {
+        return (mongo.Mongo.UpdateResponse) response_;
+      }
+      return mongo.Mongo.UpdateResponse.getDefaultInstance();
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (status_ != mongo.Mongo.MongoResponse.Status.OK.getNumber()) {
+        output.writeEnum(1, status_);
+      }
+      if (responseCase_ == 2) {
+        output.writeMessage(2, (mongo.Mongo.CleanupResponse) response_);
+      }
+      if (responseCase_ == 3) {
+        output.writeMessage(3, (mongo.Mongo.DeleteResponse) response_);
+      }
+      if (responseCase_ == 4) {
+        output.writeMessage(4, (mongo.Mongo.InsertResponse) response_);
+      }
+      if (responseCase_ == 5) {
+        output.writeMessage(5, (mongo.Mongo.ReadResponse) response_);
+      }
+      if (responseCase_ == 6) {
+        output.writeMessage(6, (mongo.Mongo.ScanResponse) response_);
+      }
+      if (responseCase_ == 7) {
+        output.writeMessage(7, (mongo.Mongo.UpdateResponse) response_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (status_ != mongo.Mongo.MongoResponse.Status.OK.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeEnumSize(1, status_);
+      }
+      if (responseCase_ == 2) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(2, (mongo.Mongo.CleanupResponse) response_);
+      }
+      if (responseCase_ == 3) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(3, (mongo.Mongo.DeleteResponse) response_);
+      }
+      if (responseCase_ == 4) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(4, (mongo.Mongo.InsertResponse) response_);
+      }
+      if (responseCase_ == 5) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(5, (mongo.Mongo.ReadResponse) response_);
+      }
+      if (responseCase_ == 6) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(6, (mongo.Mongo.ScanResponse) response_);
+      }
+      if (responseCase_ == 7) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(7, (mongo.Mongo.UpdateResponse) response_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.MongoResponse)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.MongoResponse other = (mongo.Mongo.MongoResponse) obj;
+
+      if (status_ != other.status_)
+        return false;
+      if (!getResponseCase().equals(other.getResponseCase()))
+        return false;
+      switch (responseCase_) {
+        case 2:
+          if (!getCleanup()
+              .equals(other.getCleanup()))
+            return false;
+          break;
+        case 3:
+          if (!getDelete()
+              .equals(other.getDelete()))
+            return false;
+          break;
+        case 4:
+          if (!getInsert()
+              .equals(other.getInsert()))
+            return false;
+          break;
+        case 5:
+          if (!getRead()
+              .equals(other.getRead()))
+            return false;
+          break;
+        case 6:
+          if (!getScan()
+              .equals(other.getScan()))
+            return false;
+          break;
+        case 7:
+          if (!getUpdate()
+              .equals(other.getUpdate()))
+            return false;
+          break;
+        case 0:
+        default:
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + STATUS_FIELD_NUMBER;
+      hash = (53 * hash) + status_;
+      switch (responseCase_) {
+        case 2:
+          hash = (37 * hash) + CLEANUP_FIELD_NUMBER;
+          hash = (53 * hash) + getCleanup().hashCode();
+          break;
+        case 3:
+          hash = (37 * hash) + DELETE_FIELD_NUMBER;
+          hash = (53 * hash) + getDelete().hashCode();
+          break;
+        case 4:
+          hash = (37 * hash) + INSERT_FIELD_NUMBER;
+          hash = (53 * hash) + getInsert().hashCode();
+          break;
+        case 5:
+          hash = (37 * hash) + READ_FIELD_NUMBER;
+          hash = (53 * hash) + getRead().hashCode();
+          break;
+        case 6:
+          hash = (37 * hash) + SCAN_FIELD_NUMBER;
+          hash = (53 * hash) + getScan().hashCode();
+          break;
+        case 7:
+          hash = (37 * hash) + UPDATE_FIELD_NUMBER;
+          hash = (53 * hash) + getUpdate().hashCode();
+          break;
+        case 0:
+        default:
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.MongoResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.MongoResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.MongoResponse prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.MongoResponse}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.MongoResponse)
+        mongo.Mongo.MongoResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_MongoResponse_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_MongoResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.MongoResponse.class, mongo.Mongo.MongoResponse.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.MongoResponse.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        status_ = 0;
+
+        if (cleanupBuilder_ != null) {
+          cleanupBuilder_.clear();
+        }
+        if (deleteBuilder_ != null) {
+          deleteBuilder_.clear();
+        }
+        if (insertBuilder_ != null) {
+          insertBuilder_.clear();
+        }
+        if (readBuilder_ != null) {
+          readBuilder_.clear();
+        }
+        if (scanBuilder_ != null) {
+          scanBuilder_.clear();
+        }
+        if (updateBuilder_ != null) {
+          updateBuilder_.clear();
+        }
+        responseCase_ = 0;
+        response_ = null;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_MongoResponse_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.MongoResponse getDefaultInstanceForType() {
+        return mongo.Mongo.MongoResponse.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.MongoResponse build() {
+        mongo.Mongo.MongoResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.MongoResponse buildPartial() {
+        mongo.Mongo.MongoResponse result = new mongo.Mongo.MongoResponse(this);
+        result.status_ = status_;
+        if (responseCase_ == 2) {
+          if (cleanupBuilder_ == null) {
+            result.response_ = response_;
+          } else {
+            result.response_ = cleanupBuilder_.build();
+          }
+        }
+        if (responseCase_ == 3) {
+          if (deleteBuilder_ == null) {
+            result.response_ = response_;
+          } else {
+            result.response_ = deleteBuilder_.build();
+          }
+        }
+        if (responseCase_ == 4) {
+          if (insertBuilder_ == null) {
+            result.response_ = response_;
+          } else {
+            result.response_ = insertBuilder_.build();
+          }
+        }
+        if (responseCase_ == 5) {
+          if (readBuilder_ == null) {
+            result.response_ = response_;
+          } else {
+            result.response_ = readBuilder_.build();
+          }
+        }
+        if (responseCase_ == 6) {
+          if (scanBuilder_ == null) {
+            result.response_ = response_;
+          } else {
+            result.response_ = scanBuilder_.build();
+          }
+        }
+        if (responseCase_ == 7) {
+          if (updateBuilder_ == null) {
+            result.response_ = response_;
+          } else {
+            result.response_ = updateBuilder_.build();
+          }
+        }
+        result.responseCase_ = responseCase_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.MongoResponse) {
+          return mergeFrom((mongo.Mongo.MongoResponse) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.MongoResponse other) {
+        if (other == mongo.Mongo.MongoResponse.getDefaultInstance())
+          return this;
+        if (other.status_ != 0) {
+          setStatusValue(other.getStatusValue());
+        }
+        switch (other.getResponseCase()) {
+          case CLEANUP: {
+            mergeCleanup(other.getCleanup());
+            break;
+          }
+          case DELETE: {
+            mergeDelete(other.getDelete());
+            break;
+          }
+          case INSERT: {
+            mergeInsert(other.getInsert());
+            break;
+          }
+          case READ: {
+            mergeRead(other.getRead());
+            break;
+          }
+          case SCAN: {
+            mergeScan(other.getScan());
+            break;
+          }
+          case UPDATE: {
+            mergeUpdate(other.getUpdate());
+            break;
+          }
+          case RESPONSE_NOT_SET: {
+            break;
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8: {
+                status_ = input.readEnum();
+
+                break;
+              } // case 8
+              case 18: {
+                input.readMessage(
+                    getCleanupFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                responseCase_ = 2;
+                break;
+              } // case 18
+              case 26: {
+                input.readMessage(
+                    getDeleteFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                responseCase_ = 3;
+                break;
+              } // case 26
+              case 34: {
+                input.readMessage(
+                    getInsertFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                responseCase_ = 4;
+                break;
+              } // case 34
+              case 42: {
+                input.readMessage(
+                    getReadFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                responseCase_ = 5;
+                break;
+              } // case 42
+              case 50: {
+                input.readMessage(
+                    getScanFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                responseCase_ = 6;
+                break;
+              } // case 50
+              case 58: {
+                input.readMessage(
+                    getUpdateFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                responseCase_ = 7;
+                break;
+              } // case 58
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int responseCase_ = 0;
+      private java.lang.Object response_;
+
+      public ResponseCase getResponseCase() {
+        return ResponseCase.forNumber(
+            responseCase_);
+      }
+
+      public Builder clearResponse() {
+        responseCase_ = 0;
+        response_ = null;
+        onChanged();
+        return this;
+      }
+
+      private int status_ = 0;
+
+      /**
+       * .mongo.MongoResponse.Status status = 1;
+       * 
+       * @return The enum numeric value on the wire for status.
+       */
+      @java.lang.Override
+      public int getStatusValue() {
+        return status_;
+      }
+
+      /**
+       * .mongo.MongoResponse.Status status = 1;
+       * 
+       * @param value The enum numeric value on the wire for status to set.
+       * @return This builder for chaining.
+       */
+      public Builder setStatusValue(int value) {
+
+        status_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * .mongo.MongoResponse.Status status = 1;
+       * 
+       * @return The status.
+       */
+      @java.lang.Override
+      public mongo.Mongo.MongoResponse.Status getStatus() {
+        @SuppressWarnings("deprecation")
+        mongo.Mongo.MongoResponse.Status result = mongo.Mongo.MongoResponse.Status.valueOf(status_);
+        return result == null ? mongo.Mongo.MongoResponse.Status.UNRECOGNIZED : result;
+      }
+
+      /**
+       * .mongo.MongoResponse.Status status = 1;
+       * 
+       * @param value The status to set.
+       * @return This builder for chaining.
+       */
+      public Builder setStatus(mongo.Mongo.MongoResponse.Status value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        status_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * .mongo.MongoResponse.Status status = 1;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearStatus() {
+
+        status_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 cleanupBuilder_;
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       * 
+       * @return Whether the cleanup field is set.
+       */
+      @java.lang.Override
+      public boolean hasCleanup() {
+        return responseCase_ == 2;
+      }
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       * 
+       * @return The cleanup.
+       */
+      @java.lang.Override
+      public mongo.Mongo.CleanupResponse getCleanup() {
+        if (cleanupBuilder_ == null) {
+          if (responseCase_ == 2) {
+            return (mongo.Mongo.CleanupResponse) response_;
+          }
+          return mongo.Mongo.CleanupResponse.getDefaultInstance();
+        } else {
+          if (responseCase_ == 2) {
+            return cleanupBuilder_.getMessage();
+          }
+          return mongo.Mongo.CleanupResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       */
+      public Builder setCleanup(mongo.Mongo.CleanupResponse value) {
+        if (cleanupBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          response_ = value;
+          onChanged();
+        } else {
+          cleanupBuilder_.setMessage(value);
+        }
+        responseCase_ = 2;
+        return this;
+      }
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       */
+      public Builder setCleanup(
+          mongo.Mongo.CleanupResponse.Builder builderForValue) {
+        if (cleanupBuilder_ == null) {
+          response_ = builderForValue.build();
+          onChanged();
+        } else {
+          cleanupBuilder_.setMessage(builderForValue.build());
+        }
+        responseCase_ = 2;
+        return this;
+      }
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       */
+      public Builder mergeCleanup(mongo.Mongo.CleanupResponse value) {
+        if (cleanupBuilder_ == null) {
+          if (responseCase_ == 2 &&
+              response_ != mongo.Mongo.CleanupResponse.getDefaultInstance()) {
+            response_ = mongo.Mongo.CleanupResponse.newBuilder((mongo.Mongo.CleanupResponse) response_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            response_ = value;
+          }
+          onChanged();
+        } else {
+          if (responseCase_ == 2) {
+            cleanupBuilder_.mergeFrom(value);
+          }
+          cleanupBuilder_.setMessage(value);
+        }
+        responseCase_ = 2;
+        return this;
+      }
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       */
+      public Builder clearCleanup() {
+        if (cleanupBuilder_ == null) {
+          if (responseCase_ == 2) {
+            responseCase_ = 0;
+            response_ = null;
+            onChanged();
+          }
+        } else {
+          if (responseCase_ == 2) {
+            responseCase_ = 0;
+            response_ = null;
+          }
+          cleanupBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       */
+      public mongo.Mongo.CleanupResponse.Builder getCleanupBuilder() {
+        return getCleanupFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       */
+      @java.lang.Override
+      public mongo.Mongo.CleanupResponseOrBuilder getCleanupOrBuilder() {
+        if ((responseCase_ == 2) && (cleanupBuilder_ != null)) {
+          return cleanupBuilder_.getMessageOrBuilder();
+        } else {
+          if (responseCase_ == 2) {
+            return (mongo.Mongo.CleanupResponse) response_;
+          }
+          return mongo.Mongo.CleanupResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.CleanupResponse cleanup = 2;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getCleanupFieldBuilder() {
+        if (cleanupBuilder_ == null) {
+          if (!(responseCase_ == 2)) {
+            response_ = mongo.Mongo.CleanupResponse.getDefaultInstance();
+          }
+          cleanupBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.CleanupResponse) response_,
+              getParentForChildren(),
+              isClean());
+          response_ = null;
+        }
+        responseCase_ = 2;
+        onChanged();
+        ;
+        return cleanupBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 deleteBuilder_;
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       * 
+       * @return Whether the delete field is set.
+       */
+      @java.lang.Override
+      public boolean hasDelete() {
+        return responseCase_ == 3;
+      }
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       * 
+       * @return The delete.
+       */
+      @java.lang.Override
+      public mongo.Mongo.DeleteResponse getDelete() {
+        if (deleteBuilder_ == null) {
+          if (responseCase_ == 3) {
+            return (mongo.Mongo.DeleteResponse) response_;
+          }
+          return mongo.Mongo.DeleteResponse.getDefaultInstance();
+        } else {
+          if (responseCase_ == 3) {
+            return deleteBuilder_.getMessage();
+          }
+          return mongo.Mongo.DeleteResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       */
+      public Builder setDelete(mongo.Mongo.DeleteResponse value) {
+        if (deleteBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          response_ = value;
+          onChanged();
+        } else {
+          deleteBuilder_.setMessage(value);
+        }
+        responseCase_ = 3;
+        return this;
+      }
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       */
+      public Builder setDelete(
+          mongo.Mongo.DeleteResponse.Builder builderForValue) {
+        if (deleteBuilder_ == null) {
+          response_ = builderForValue.build();
+          onChanged();
+        } else {
+          deleteBuilder_.setMessage(builderForValue.build());
+        }
+        responseCase_ = 3;
+        return this;
+      }
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       */
+      public Builder mergeDelete(mongo.Mongo.DeleteResponse value) {
+        if (deleteBuilder_ == null) {
+          if (responseCase_ == 3 &&
+              response_ != mongo.Mongo.DeleteResponse.getDefaultInstance()) {
+            response_ = mongo.Mongo.DeleteResponse.newBuilder((mongo.Mongo.DeleteResponse) response_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            response_ = value;
+          }
+          onChanged();
+        } else {
+          if (responseCase_ == 3) {
+            deleteBuilder_.mergeFrom(value);
+          }
+          deleteBuilder_.setMessage(value);
+        }
+        responseCase_ = 3;
+        return this;
+      }
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       */
+      public Builder clearDelete() {
+        if (deleteBuilder_ == null) {
+          if (responseCase_ == 3) {
+            responseCase_ = 0;
+            response_ = null;
+            onChanged();
+          }
+        } else {
+          if (responseCase_ == 3) {
+            responseCase_ = 0;
+            response_ = null;
+          }
+          deleteBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       */
+      public mongo.Mongo.DeleteResponse.Builder getDeleteBuilder() {
+        return getDeleteFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       */
+      @java.lang.Override
+      public mongo.Mongo.DeleteResponseOrBuilder getDeleteOrBuilder() {
+        if ((responseCase_ == 3) && (deleteBuilder_ != null)) {
+          return deleteBuilder_.getMessageOrBuilder();
+        } else {
+          if (responseCase_ == 3) {
+            return (mongo.Mongo.DeleteResponse) response_;
+          }
+          return mongo.Mongo.DeleteResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.DeleteResponse delete = 3;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getDeleteFieldBuilder() {
+        if (deleteBuilder_ == null) {
+          if (!(responseCase_ == 3)) {
+            response_ = mongo.Mongo.DeleteResponse.getDefaultInstance();
+          }
+          deleteBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.DeleteResponse) response_,
+              getParentForChildren(),
+              isClean());
+          response_ = null;
+        }
+        responseCase_ = 3;
+        onChanged();
+        ;
+        return deleteBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 insertBuilder_;
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       * 
+       * @return Whether the insert field is set.
+       */
+      @java.lang.Override
+      public boolean hasInsert() {
+        return responseCase_ == 4;
+      }
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       * 
+       * @return The insert.
+       */
+      @java.lang.Override
+      public mongo.Mongo.InsertResponse getInsert() {
+        if (insertBuilder_ == null) {
+          if (responseCase_ == 4) {
+            return (mongo.Mongo.InsertResponse) response_;
+          }
+          return mongo.Mongo.InsertResponse.getDefaultInstance();
+        } else {
+          if (responseCase_ == 4) {
+            return insertBuilder_.getMessage();
+          }
+          return mongo.Mongo.InsertResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       */
+      public Builder setInsert(mongo.Mongo.InsertResponse value) {
+        if (insertBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          response_ = value;
+          onChanged();
+        } else {
+          insertBuilder_.setMessage(value);
+        }
+        responseCase_ = 4;
+        return this;
+      }
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       */
+      public Builder setInsert(
+          mongo.Mongo.InsertResponse.Builder builderForValue) {
+        if (insertBuilder_ == null) {
+          response_ = builderForValue.build();
+          onChanged();
+        } else {
+          insertBuilder_.setMessage(builderForValue.build());
+        }
+        responseCase_ = 4;
+        return this;
+      }
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       */
+      public Builder mergeInsert(mongo.Mongo.InsertResponse value) {
+        if (insertBuilder_ == null) {
+          if (responseCase_ == 4 &&
+              response_ != mongo.Mongo.InsertResponse.getDefaultInstance()) {
+            response_ = mongo.Mongo.InsertResponse.newBuilder((mongo.Mongo.InsertResponse) response_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            response_ = value;
+          }
+          onChanged();
+        } else {
+          if (responseCase_ == 4) {
+            insertBuilder_.mergeFrom(value);
+          }
+          insertBuilder_.setMessage(value);
+        }
+        responseCase_ = 4;
+        return this;
+      }
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       */
+      public Builder clearInsert() {
+        if (insertBuilder_ == null) {
+          if (responseCase_ == 4) {
+            responseCase_ = 0;
+            response_ = null;
+            onChanged();
+          }
+        } else {
+          if (responseCase_ == 4) {
+            responseCase_ = 0;
+            response_ = null;
+          }
+          insertBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       */
+      public mongo.Mongo.InsertResponse.Builder getInsertBuilder() {
+        return getInsertFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       */
+      @java.lang.Override
+      public mongo.Mongo.InsertResponseOrBuilder getInsertOrBuilder() {
+        if ((responseCase_ == 4) && (insertBuilder_ != null)) {
+          return insertBuilder_.getMessageOrBuilder();
+        } else {
+          if (responseCase_ == 4) {
+            return (mongo.Mongo.InsertResponse) response_;
+          }
+          return mongo.Mongo.InsertResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.InsertResponse insert = 4;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getInsertFieldBuilder() {
+        if (insertBuilder_ == null) {
+          if (!(responseCase_ == 4)) {
+            response_ = mongo.Mongo.InsertResponse.getDefaultInstance();
+          }
+          insertBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.InsertResponse) response_,
+              getParentForChildren(),
+              isClean());
+          response_ = null;
+        }
+        responseCase_ = 4;
+        onChanged();
+        ;
+        return insertBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 readBuilder_;
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       * 
+       * @return Whether the read field is set.
+       */
+      @java.lang.Override
+      public boolean hasRead() {
+        return responseCase_ == 5;
+      }
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       * 
+       * @return The read.
+       */
+      @java.lang.Override
+      public mongo.Mongo.ReadResponse getRead() {
+        if (readBuilder_ == null) {
+          if (responseCase_ == 5) {
+            return (mongo.Mongo.ReadResponse) response_;
+          }
+          return mongo.Mongo.ReadResponse.getDefaultInstance();
+        } else {
+          if (responseCase_ == 5) {
+            return readBuilder_.getMessage();
+          }
+          return mongo.Mongo.ReadResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       */
+      public Builder setRead(mongo.Mongo.ReadResponse value) {
+        if (readBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          response_ = value;
+          onChanged();
+        } else {
+          readBuilder_.setMessage(value);
+        }
+        responseCase_ = 5;
+        return this;
+      }
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       */
+      public Builder setRead(
+          mongo.Mongo.ReadResponse.Builder builderForValue) {
+        if (readBuilder_ == null) {
+          response_ = builderForValue.build();
+          onChanged();
+        } else {
+          readBuilder_.setMessage(builderForValue.build());
+        }
+        responseCase_ = 5;
+        return this;
+      }
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       */
+      public Builder mergeRead(mongo.Mongo.ReadResponse value) {
+        if (readBuilder_ == null) {
+          if (responseCase_ == 5 &&
+              response_ != mongo.Mongo.ReadResponse.getDefaultInstance()) {
+            response_ = mongo.Mongo.ReadResponse.newBuilder((mongo.Mongo.ReadResponse) response_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            response_ = value;
+          }
+          onChanged();
+        } else {
+          if (responseCase_ == 5) {
+            readBuilder_.mergeFrom(value);
+          }
+          readBuilder_.setMessage(value);
+        }
+        responseCase_ = 5;
+        return this;
+      }
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       */
+      public Builder clearRead() {
+        if (readBuilder_ == null) {
+          if (responseCase_ == 5) {
+            responseCase_ = 0;
+            response_ = null;
+            onChanged();
+          }
+        } else {
+          if (responseCase_ == 5) {
+            responseCase_ = 0;
+            response_ = null;
+          }
+          readBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       */
+      public mongo.Mongo.ReadResponse.Builder getReadBuilder() {
+        return getReadFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       */
+      @java.lang.Override
+      public mongo.Mongo.ReadResponseOrBuilder getReadOrBuilder() {
+        if ((responseCase_ == 5) && (readBuilder_ != null)) {
+          return readBuilder_.getMessageOrBuilder();
+        } else {
+          if (responseCase_ == 5) {
+            return (mongo.Mongo.ReadResponse) response_;
+          }
+          return mongo.Mongo.ReadResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.ReadResponse read = 5;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getReadFieldBuilder() {
+        if (readBuilder_ == null) {
+          if (!(responseCase_ == 5)) {
+            response_ = mongo.Mongo.ReadResponse.getDefaultInstance();
+          }
+          readBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.ReadResponse) response_,
+              getParentForChildren(),
+              isClean());
+          response_ = null;
+        }
+        responseCase_ = 5;
+        onChanged();
+        ;
+        return readBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 scanBuilder_;
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       * 
+       * @return Whether the scan field is set.
+       */
+      @java.lang.Override
+      public boolean hasScan() {
+        return responseCase_ == 6;
+      }
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       * 
+       * @return The scan.
+       */
+      @java.lang.Override
+      public mongo.Mongo.ScanResponse getScan() {
+        if (scanBuilder_ == null) {
+          if (responseCase_ == 6) {
+            return (mongo.Mongo.ScanResponse) response_;
+          }
+          return mongo.Mongo.ScanResponse.getDefaultInstance();
+        } else {
+          if (responseCase_ == 6) {
+            return scanBuilder_.getMessage();
+          }
+          return mongo.Mongo.ScanResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       */
+      public Builder setScan(mongo.Mongo.ScanResponse value) {
+        if (scanBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          response_ = value;
+          onChanged();
+        } else {
+          scanBuilder_.setMessage(value);
+        }
+        responseCase_ = 6;
+        return this;
+      }
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       */
+      public Builder setScan(
+          mongo.Mongo.ScanResponse.Builder builderForValue) {
+        if (scanBuilder_ == null) {
+          response_ = builderForValue.build();
+          onChanged();
+        } else {
+          scanBuilder_.setMessage(builderForValue.build());
+        }
+        responseCase_ = 6;
+        return this;
+      }
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       */
+      public Builder mergeScan(mongo.Mongo.ScanResponse value) {
+        if (scanBuilder_ == null) {
+          if (responseCase_ == 6 &&
+              response_ != mongo.Mongo.ScanResponse.getDefaultInstance()) {
+            response_ = mongo.Mongo.ScanResponse.newBuilder((mongo.Mongo.ScanResponse) response_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            response_ = value;
+          }
+          onChanged();
+        } else {
+          if (responseCase_ == 6) {
+            scanBuilder_.mergeFrom(value);
+          }
+          scanBuilder_.setMessage(value);
+        }
+        responseCase_ = 6;
+        return this;
+      }
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       */
+      public Builder clearScan() {
+        if (scanBuilder_ == null) {
+          if (responseCase_ == 6) {
+            responseCase_ = 0;
+            response_ = null;
+            onChanged();
+          }
+        } else {
+          if (responseCase_ == 6) {
+            responseCase_ = 0;
+            response_ = null;
+          }
+          scanBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       */
+      public mongo.Mongo.ScanResponse.Builder getScanBuilder() {
+        return getScanFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       */
+      @java.lang.Override
+      public mongo.Mongo.ScanResponseOrBuilder getScanOrBuilder() {
+        if ((responseCase_ == 6) && (scanBuilder_ != null)) {
+          return scanBuilder_.getMessageOrBuilder();
+        } else {
+          if (responseCase_ == 6) {
+            return (mongo.Mongo.ScanResponse) response_;
+          }
+          return mongo.Mongo.ScanResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.ScanResponse scan = 6;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getScanFieldBuilder() {
+        if (scanBuilder_ == null) {
+          if (!(responseCase_ == 6)) {
+            response_ = mongo.Mongo.ScanResponse.getDefaultInstance();
+          }
+          scanBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.ScanResponse) response_,
+              getParentForChildren(),
+              isClean());
+          response_ = null;
+        }
+        responseCase_ = 6;
+        onChanged();
+        ;
+        return scanBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3 updateBuilder_;
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       * 
+       * @return Whether the update field is set.
+       */
+      @java.lang.Override
+      public boolean hasUpdate() {
+        return responseCase_ == 7;
+      }
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       * 
+       * @return The update.
+       */
+      @java.lang.Override
+      public mongo.Mongo.UpdateResponse getUpdate() {
+        if (updateBuilder_ == null) {
+          if (responseCase_ == 7) {
+            return (mongo.Mongo.UpdateResponse) response_;
+          }
+          return mongo.Mongo.UpdateResponse.getDefaultInstance();
+        } else {
+          if (responseCase_ == 7) {
+            return updateBuilder_.getMessage();
+          }
+          return mongo.Mongo.UpdateResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       */
+      public Builder setUpdate(mongo.Mongo.UpdateResponse value) {
+        if (updateBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          response_ = value;
+          onChanged();
+        } else {
+          updateBuilder_.setMessage(value);
+        }
+        responseCase_ = 7;
+        return this;
+      }
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       */
+      public Builder setUpdate(
+          mongo.Mongo.UpdateResponse.Builder builderForValue) {
+        if (updateBuilder_ == null) {
+          response_ = builderForValue.build();
+          onChanged();
+        } else {
+          updateBuilder_.setMessage(builderForValue.build());
+        }
+        responseCase_ = 7;
+        return this;
+      }
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       */
+      public Builder mergeUpdate(mongo.Mongo.UpdateResponse value) {
+        if (updateBuilder_ == null) {
+          if (responseCase_ == 7 &&
+              response_ != mongo.Mongo.UpdateResponse.getDefaultInstance()) {
+            response_ = mongo.Mongo.UpdateResponse.newBuilder((mongo.Mongo.UpdateResponse) response_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            response_ = value;
+          }
+          onChanged();
+        } else {
+          if (responseCase_ == 7) {
+            updateBuilder_.mergeFrom(value);
+          }
+          updateBuilder_.setMessage(value);
+        }
+        responseCase_ = 7;
+        return this;
+      }
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       */
+      public Builder clearUpdate() {
+        if (updateBuilder_ == null) {
+          if (responseCase_ == 7) {
+            responseCase_ = 0;
+            response_ = null;
+            onChanged();
+          }
+        } else {
+          if (responseCase_ == 7) {
+            responseCase_ = 0;
+            response_ = null;
+          }
+          updateBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       */
+      public mongo.Mongo.UpdateResponse.Builder getUpdateBuilder() {
+        return getUpdateFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       */
+      @java.lang.Override
+      public mongo.Mongo.UpdateResponseOrBuilder getUpdateOrBuilder() {
+        if ((responseCase_ == 7) && (updateBuilder_ != null)) {
+          return updateBuilder_.getMessageOrBuilder();
+        } else {
+          if (responseCase_ == 7) {
+            return (mongo.Mongo.UpdateResponse) response_;
+          }
+          return mongo.Mongo.UpdateResponse.getDefaultInstance();
+        }
+      }
+
+      /**
+       * .mongo.UpdateResponse update = 7;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getUpdateFieldBuilder() {
+        if (updateBuilder_ == null) {
+          if (!(responseCase_ == 7)) {
+            response_ = mongo.Mongo.UpdateResponse.getDefaultInstance();
+          }
+          updateBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              (mongo.Mongo.UpdateResponse) response_,
+              getParentForChildren(),
+              isClean());
+          response_ = null;
+        }
+        responseCase_ = 7;
+        onChanged();
+        ;
+        return updateBuilder_;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.MongoResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.MongoResponse)
+    private static final mongo.Mongo.MongoResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.MongoResponse();
+    }
+
+    public static mongo.Mongo.MongoResponse getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public MongoResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.MongoResponse getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface CleanupRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.CleanupRequest)
+      com.google.protobuf.MessageOrBuilder {
+  }
+
+  /**
+   * Protobuf type {@code mongo.CleanupRequest}
+   */
+  public static final class CleanupRequest extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.CleanupRequest)
+      CleanupRequestOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use CleanupRequest.newBuilder() to construct.
+    private CleanupRequest(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private CleanupRequest() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new CleanupRequest();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_CleanupRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_CleanupRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.CleanupRequest.class, mongo.Mongo.CleanupRequest.Builder.class);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.CleanupRequest)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.CleanupRequest other = (mongo.Mongo.CleanupRequest) obj;
+
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.CleanupRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.CleanupRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.CleanupRequest}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.CleanupRequest)
+        mongo.Mongo.CleanupRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_CleanupRequest_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_CleanupRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.CleanupRequest.class, mongo.Mongo.CleanupRequest.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.CleanupRequest.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_CleanupRequest_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.CleanupRequest getDefaultInstanceForType() {
+        return mongo.Mongo.CleanupRequest.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.CleanupRequest build() {
+        mongo.Mongo.CleanupRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.CleanupRequest buildPartial() {
+        mongo.Mongo.CleanupRequest result = new mongo.Mongo.CleanupRequest(this);
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.CleanupRequest) {
+          return mergeFrom((mongo.Mongo.CleanupRequest) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.CleanupRequest other) {
+        if (other == mongo.Mongo.CleanupRequest.getDefaultInstance())
+          return this;
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.CleanupRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.CleanupRequest)
+    private static final mongo.Mongo.CleanupRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.CleanupRequest();
+    }
+
+    public static mongo.Mongo.CleanupRequest getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public CleanupRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.CleanupRequest getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface CleanupResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.CleanupResponse)
+      com.google.protobuf.MessageOrBuilder {
+  }
+
+  /**
+   * Protobuf type {@code mongo.CleanupResponse}
+   */
+  public static final class CleanupResponse extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.CleanupResponse)
+      CleanupResponseOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use CleanupResponse.newBuilder() to construct.
+    private CleanupResponse(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private CleanupResponse() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new CleanupResponse();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_CleanupResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_CleanupResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.CleanupResponse.class, mongo.Mongo.CleanupResponse.Builder.class);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.CleanupResponse)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.CleanupResponse other = (mongo.Mongo.CleanupResponse) obj;
+
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.CleanupResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.CleanupResponse prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.CleanupResponse}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.CleanupResponse)
+        mongo.Mongo.CleanupResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_CleanupResponse_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_CleanupResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.CleanupResponse.class, mongo.Mongo.CleanupResponse.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.CleanupResponse.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_CleanupResponse_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.CleanupResponse getDefaultInstanceForType() {
+        return mongo.Mongo.CleanupResponse.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.CleanupResponse build() {
+        mongo.Mongo.CleanupResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.CleanupResponse buildPartial() {
+        mongo.Mongo.CleanupResponse result = new mongo.Mongo.CleanupResponse(this);
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.CleanupResponse) {
+          return mergeFrom((mongo.Mongo.CleanupResponse) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.CleanupResponse other) {
+        if (other == mongo.Mongo.CleanupResponse.getDefaultInstance())
+          return this;
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.CleanupResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.CleanupResponse)
+    private static final mongo.Mongo.CleanupResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.CleanupResponse();
+    }
+
+    public static mongo.Mongo.CleanupResponse getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public CleanupResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.CleanupResponse getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface DeleteRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.DeleteRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    java.lang.String getCollection();
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    com.google.protobuf.ByteString getCollectionBytes();
+
+    /**
+     * string id = 2;
+     * 
+     * @return The id.
+     */
+    java.lang.String getId();
+
+    /**
+     * string id = 2;
+     * 
+     * @return The bytes for id.
+     */
+    com.google.protobuf.ByteString getIdBytes();
+  }
+
+  /**
+   * Protobuf type {@code mongo.DeleteRequest}
+   */
+  public static final class DeleteRequest extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.DeleteRequest)
+      DeleteRequestOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use DeleteRequest.newBuilder() to construct.
+    private DeleteRequest(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private DeleteRequest() {
+      collection_ = "";
+      id_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new DeleteRequest();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_DeleteRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_DeleteRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.DeleteRequest.class, mongo.Mongo.DeleteRequest.Builder.class);
+    }
+
+    public static final int COLLECTION_FIELD_NUMBER = 1;
+    private volatile java.lang.Object collection_;
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    @java.lang.Override
+    public java.lang.String getCollection() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        collection_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getCollectionBytes() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        collection_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int ID_FIELD_NUMBER = 2;
+    private volatile java.lang.Object id_;
+
+    /**
+     * string id = 2;
+     * 
+     * @return The id.
+     */
+    @java.lang.Override
+    public java.lang.String getId() {
+      java.lang.Object ref = id_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        id_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string id = 2;
+     * 
+     * @return The bytes for id.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getIdBytes() {
+      java.lang.Object ref = id_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        id_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, collection_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, id_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, collection_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, id_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.DeleteRequest)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.DeleteRequest other = (mongo.Mongo.DeleteRequest) obj;
+
+      if (!getCollection()
+          .equals(other.getCollection()))
+        return false;
+      if (!getId()
+          .equals(other.getId()))
+        return false;
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + COLLECTION_FIELD_NUMBER;
+      hash = (53 * hash) + getCollection().hashCode();
+      hash = (37 * hash) + ID_FIELD_NUMBER;
+      hash = (53 * hash) + getId().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.DeleteRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.DeleteRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.DeleteRequest}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.DeleteRequest)
+        mongo.Mongo.DeleteRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_DeleteRequest_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_DeleteRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.DeleteRequest.class, mongo.Mongo.DeleteRequest.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.DeleteRequest.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        collection_ = "";
+
+        id_ = "";
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_DeleteRequest_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.DeleteRequest getDefaultInstanceForType() {
+        return mongo.Mongo.DeleteRequest.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.DeleteRequest build() {
+        mongo.Mongo.DeleteRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.DeleteRequest buildPartial() {
+        mongo.Mongo.DeleteRequest result = new mongo.Mongo.DeleteRequest(this);
+        result.collection_ = collection_;
+        result.id_ = id_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.DeleteRequest) {
+          return mergeFrom((mongo.Mongo.DeleteRequest) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.DeleteRequest other) {
+        if (other == mongo.Mongo.DeleteRequest.getDefaultInstance())
+          return this;
+        if (!other.getCollection().isEmpty()) {
+          collection_ = other.collection_;
+          onChanged();
+        }
+        if (!other.getId().isEmpty()) {
+          id_ = other.id_;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                collection_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 10
+              case 18: {
+                id_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 18
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private java.lang.Object collection_ = "";
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The collection.
+       */
+      public java.lang.String getCollection() {
+        java.lang.Object ref = collection_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          collection_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The bytes for collection.
+       */
+      public com.google.protobuf.ByteString getCollectionBytes() {
+        java.lang.Object ref = collection_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          collection_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollection(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearCollection() {
+
+        collection_ = getDefaultInstance().getCollection();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The bytes for collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollectionBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object id_ = "";
+
+      /**
+       * string id = 2;
+       * 
+       * @return The id.
+       */
+      public java.lang.String getId() {
+        java.lang.Object ref = id_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          id_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @return The bytes for id.
+       */
+      public com.google.protobuf.ByteString getIdBytes() {
+        java.lang.Object ref = id_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          id_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @param value The id to set.
+       * @return This builder for chaining.
+       */
+      public Builder setId(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        id_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearId() {
+
+        id_ = getDefaultInstance().getId();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @param value The bytes for id to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        id_ = value;
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.DeleteRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.DeleteRequest)
+    private static final mongo.Mongo.DeleteRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.DeleteRequest();
+    }
+
+    public static mongo.Mongo.DeleteRequest getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public DeleteRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.DeleteRequest getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface DeleteResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.DeleteResponse)
+      com.google.protobuf.MessageOrBuilder {
+  }
+
+  /**
+   * Protobuf type {@code mongo.DeleteResponse}
+   */
+  public static final class DeleteResponse extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.DeleteResponse)
+      DeleteResponseOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use DeleteResponse.newBuilder() to construct.
+    private DeleteResponse(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private DeleteResponse() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new DeleteResponse();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_DeleteResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_DeleteResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.DeleteResponse.class, mongo.Mongo.DeleteResponse.Builder.class);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.DeleteResponse)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.DeleteResponse other = (mongo.Mongo.DeleteResponse) obj;
+
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.DeleteResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.DeleteResponse prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.DeleteResponse}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.DeleteResponse)
+        mongo.Mongo.DeleteResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_DeleteResponse_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_DeleteResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.DeleteResponse.class, mongo.Mongo.DeleteResponse.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.DeleteResponse.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_DeleteResponse_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.DeleteResponse getDefaultInstanceForType() {
+        return mongo.Mongo.DeleteResponse.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.DeleteResponse build() {
+        mongo.Mongo.DeleteResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.DeleteResponse buildPartial() {
+        mongo.Mongo.DeleteResponse result = new mongo.Mongo.DeleteResponse(this);
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.DeleteResponse) {
+          return mergeFrom((mongo.Mongo.DeleteResponse) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.DeleteResponse other) {
+        if (other == mongo.Mongo.DeleteResponse.getDefaultInstance())
+          return this;
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.DeleteResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.DeleteResponse)
+    private static final mongo.Mongo.DeleteResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.DeleteResponse();
+    }
+
+    public static mongo.Mongo.DeleteResponse getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public DeleteResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.DeleteResponse getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface InsertRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.InsertRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    java.lang.String getCollection();
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    com.google.protobuf.ByteString getCollectionBytes();
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    java.util.List getDocumentsList();
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    mongo.Mongo.BSONDocument getDocuments(int index);
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    int getDocumentsCount();
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    java.util.List extends mongo.Mongo.BSONDocumentOrBuilder> getDocumentsOrBuilderList();
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    mongo.Mongo.BSONDocumentOrBuilder getDocumentsOrBuilder(
+        int index);
+  }
+
+  /**
+   * Protobuf type {@code mongo.InsertRequest}
+   */
+  public static final class InsertRequest extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.InsertRequest)
+      InsertRequestOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use InsertRequest.newBuilder() to construct.
+    private InsertRequest(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private InsertRequest() {
+      collection_ = "";
+      documents_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new InsertRequest();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_InsertRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_InsertRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.InsertRequest.class, mongo.Mongo.InsertRequest.Builder.class);
+    }
+
+    public static final int COLLECTION_FIELD_NUMBER = 1;
+    private volatile java.lang.Object collection_;
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    @java.lang.Override
+    public java.lang.String getCollection() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        collection_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getCollectionBytes() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        collection_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int DOCUMENTS_FIELD_NUMBER = 2;
+    private java.util.List documents_;
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    @java.lang.Override
+    public java.util.List getDocumentsList() {
+      return documents_;
+    }
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    @java.lang.Override
+    public java.util.List extends mongo.Mongo.BSONDocumentOrBuilder> getDocumentsOrBuilderList() {
+      return documents_;
+    }
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    @java.lang.Override
+    public int getDocumentsCount() {
+      return documents_.size();
+    }
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    @java.lang.Override
+    public mongo.Mongo.BSONDocument getDocuments(int index) {
+      return documents_.get(index);
+    }
+
+    /**
+     * repeated .mongo.BSONDocument documents = 2;
+     */
+    @java.lang.Override
+    public mongo.Mongo.BSONDocumentOrBuilder getDocumentsOrBuilder(
+        int index) {
+      return documents_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, collection_);
+      }
+      for (int i = 0; i < documents_.size(); i++) {
+        output.writeMessage(2, documents_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, collection_);
+      }
+      for (int i = 0; i < documents_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(2, documents_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.InsertRequest)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.InsertRequest other = (mongo.Mongo.InsertRequest) obj;
+
+      if (!getCollection()
+          .equals(other.getCollection()))
+        return false;
+      if (!getDocumentsList()
+          .equals(other.getDocumentsList()))
+        return false;
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + COLLECTION_FIELD_NUMBER;
+      hash = (53 * hash) + getCollection().hashCode();
+      if (getDocumentsCount() > 0) {
+        hash = (37 * hash) + DOCUMENTS_FIELD_NUMBER;
+        hash = (53 * hash) + getDocumentsList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.InsertRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.InsertRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.InsertRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.InsertRequest}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.InsertRequest)
+        mongo.Mongo.InsertRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_InsertRequest_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_InsertRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.InsertRequest.class, mongo.Mongo.InsertRequest.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.InsertRequest.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        collection_ = "";
+
+        if (documentsBuilder_ == null) {
+          documents_ = java.util.Collections.emptyList();
+        } else {
+          documents_ = null;
+          documentsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_InsertRequest_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.InsertRequest getDefaultInstanceForType() {
+        return mongo.Mongo.InsertRequest.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.InsertRequest build() {
+        mongo.Mongo.InsertRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.InsertRequest buildPartial() {
+        mongo.Mongo.InsertRequest result = new mongo.Mongo.InsertRequest(this);
+        int from_bitField0_ = bitField0_;
+        result.collection_ = collection_;
+        if (documentsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            documents_ = java.util.Collections.unmodifiableList(documents_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.documents_ = documents_;
+        } else {
+          result.documents_ = documentsBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.InsertRequest) {
+          return mergeFrom((mongo.Mongo.InsertRequest) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.InsertRequest other) {
+        if (other == mongo.Mongo.InsertRequest.getDefaultInstance())
+          return this;
+        if (!other.getCollection().isEmpty()) {
+          collection_ = other.collection_;
+          onChanged();
+        }
+        if (documentsBuilder_ == null) {
+          if (!other.documents_.isEmpty()) {
+            if (documents_.isEmpty()) {
+              documents_ = other.documents_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureDocumentsIsMutable();
+              documents_.addAll(other.documents_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.documents_.isEmpty()) {
+            if (documentsBuilder_.isEmpty()) {
+              documentsBuilder_.dispose();
+              documentsBuilder_ = null;
+              documents_ = other.documents_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              documentsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders
+                  ? getDocumentsFieldBuilder()
+                  : null;
+            } else {
+              documentsBuilder_.addAllMessages(other.documents_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                collection_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 10
+              case 18: {
+                mongo.Mongo.BSONDocument m = input.readMessage(
+                    mongo.Mongo.BSONDocument.parser(),
+                    extensionRegistry);
+                if (documentsBuilder_ == null) {
+                  ensureDocumentsIsMutable();
+                  documents_.add(m);
+                } else {
+                  documentsBuilder_.addMessage(m);
+                }
+                break;
+              } // case 18
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.lang.Object collection_ = "";
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The collection.
+       */
+      public java.lang.String getCollection() {
+        java.lang.Object ref = collection_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          collection_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The bytes for collection.
+       */
+      public com.google.protobuf.ByteString getCollectionBytes() {
+        java.lang.Object ref = collection_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          collection_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollection(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearCollection() {
+
+        collection_ = getDefaultInstance().getCollection();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The bytes for collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollectionBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.util.List documents_ = java.util.Collections.emptyList();
+
+      private void ensureDocumentsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          documents_ = new java.util.ArrayList(documents_);
+          bitField0_ |= 0x00000001;
+        }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3 documentsBuilder_;
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public java.util.List getDocumentsList() {
+        if (documentsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(documents_);
+        } else {
+          return documentsBuilder_.getMessageList();
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public int getDocumentsCount() {
+        if (documentsBuilder_ == null) {
+          return documents_.size();
+        } else {
+          return documentsBuilder_.getCount();
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public mongo.Mongo.BSONDocument getDocuments(int index) {
+        if (documentsBuilder_ == null) {
+          return documents_.get(index);
+        } else {
+          return documentsBuilder_.getMessage(index);
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder setDocuments(
+          int index, mongo.Mongo.BSONDocument value) {
+        if (documentsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDocumentsIsMutable();
+          documents_.set(index, value);
+          onChanged();
+        } else {
+          documentsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder setDocuments(
+          int index, mongo.Mongo.BSONDocument.Builder builderForValue) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          documents_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          documentsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder addDocuments(mongo.Mongo.BSONDocument value) {
+        if (documentsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDocumentsIsMutable();
+          documents_.add(value);
+          onChanged();
+        } else {
+          documentsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder addDocuments(
+          int index, mongo.Mongo.BSONDocument value) {
+        if (documentsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDocumentsIsMutable();
+          documents_.add(index, value);
+          onChanged();
+        } else {
+          documentsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder addDocuments(
+          mongo.Mongo.BSONDocument.Builder builderForValue) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          documents_.add(builderForValue.build());
+          onChanged();
+        } else {
+          documentsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder addDocuments(
+          int index, mongo.Mongo.BSONDocument.Builder builderForValue) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          documents_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          documentsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder addAllDocuments(
+          java.lang.Iterable extends mongo.Mongo.BSONDocument> values) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, documents_);
+          onChanged();
+        } else {
+          documentsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder clearDocuments() {
+        if (documentsBuilder_ == null) {
+          documents_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          documentsBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public Builder removeDocuments(int index) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          documents_.remove(index);
+          onChanged();
+        } else {
+          documentsBuilder_.remove(index);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public mongo.Mongo.BSONDocument.Builder getDocumentsBuilder(
+          int index) {
+        return getDocumentsFieldBuilder().getBuilder(index);
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public mongo.Mongo.BSONDocumentOrBuilder getDocumentsOrBuilder(
+          int index) {
+        if (documentsBuilder_ == null) {
+          return documents_.get(index);
+        } else {
+          return documentsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public java.util.List extends mongo.Mongo.BSONDocumentOrBuilder> getDocumentsOrBuilderList() {
+        if (documentsBuilder_ != null) {
+          return documentsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(documents_);
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public mongo.Mongo.BSONDocument.Builder addDocumentsBuilder() {
+        return getDocumentsFieldBuilder().addBuilder(
+            mongo.Mongo.BSONDocument.getDefaultInstance());
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public mongo.Mongo.BSONDocument.Builder addDocumentsBuilder(
+          int index) {
+        return getDocumentsFieldBuilder().addBuilder(
+            index, mongo.Mongo.BSONDocument.getDefaultInstance());
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 2;
+       */
+      public java.util.List getDocumentsBuilderList() {
+        return getDocumentsFieldBuilder().getBuilderList();
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3 getDocumentsFieldBuilder() {
+        if (documentsBuilder_ == null) {
+          documentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(
+              documents_,
+              ((bitField0_ & 0x00000001) != 0),
+              getParentForChildren(),
+              isClean());
+          documents_ = null;
+        }
+        return documentsBuilder_;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.InsertRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.InsertRequest)
+    private static final mongo.Mongo.InsertRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.InsertRequest();
+    }
+
+    public static mongo.Mongo.InsertRequest getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public InsertRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.InsertRequest getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface BSONDocumentOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.BSONDocument)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * bytes data = 1;
+     * 
+     * @return The data.
+     */
+    com.google.protobuf.ByteString getData();
+  }
+
+  /**
+   * Protobuf type {@code mongo.BSONDocument}
+   */
+  public static final class BSONDocument extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.BSONDocument)
+      BSONDocumentOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use BSONDocument.newBuilder() to construct.
+    private BSONDocument(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private BSONDocument() {
+      data_ = com.google.protobuf.ByteString.EMPTY;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new BSONDocument();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_BSONDocument_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_BSONDocument_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.BSONDocument.class, mongo.Mongo.BSONDocument.Builder.class);
+    }
+
+    public static final int DATA_FIELD_NUMBER = 1;
+    private com.google.protobuf.ByteString data_;
+
+    /**
+     * bytes data = 1;
+     * 
+     * @return The data.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getData() {
+      return data_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (!data_.isEmpty()) {
+        output.writeBytes(1, data_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (!data_.isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, data_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.BSONDocument)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.BSONDocument other = (mongo.Mongo.BSONDocument) obj;
+
+      if (!getData()
+          .equals(other.getData()))
+        return false;
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + DATA_FIELD_NUMBER;
+      hash = (53 * hash) + getData().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.BSONDocument parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.BSONDocument parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.BSONDocument parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.BSONDocument prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.BSONDocument}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.BSONDocument)
+        mongo.Mongo.BSONDocumentOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_BSONDocument_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_BSONDocument_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.BSONDocument.class, mongo.Mongo.BSONDocument.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.BSONDocument.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        data_ = com.google.protobuf.ByteString.EMPTY;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_BSONDocument_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.BSONDocument getDefaultInstanceForType() {
+        return mongo.Mongo.BSONDocument.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.BSONDocument build() {
+        mongo.Mongo.BSONDocument result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.BSONDocument buildPartial() {
+        mongo.Mongo.BSONDocument result = new mongo.Mongo.BSONDocument(this);
+        result.data_ = data_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.BSONDocument) {
+          return mergeFrom((mongo.Mongo.BSONDocument) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.BSONDocument other) {
+        if (other == mongo.Mongo.BSONDocument.getDefaultInstance())
+          return this;
+        if (other.getData() != com.google.protobuf.ByteString.EMPTY) {
+          setData(other.getData());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                data_ = input.readBytes();
+
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY;
+
+      /**
+       * bytes data = 1;
+       * 
+       * @return The data.
+       */
+      @java.lang.Override
+      public com.google.protobuf.ByteString getData() {
+        return data_;
+      }
+
+      /**
+       * bytes data = 1;
+       * 
+       * @param value The data to set.
+       * @return This builder for chaining.
+       */
+      public Builder setData(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        data_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * bytes data = 1;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearData() {
+
+        data_ = getDefaultInstance().getData();
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.BSONDocument)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.BSONDocument)
+    private static final mongo.Mongo.BSONDocument DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.BSONDocument();
+    }
+
+    public static mongo.Mongo.BSONDocument getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public BSONDocument parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.BSONDocument getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface InsertResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.InsertResponse)
+      com.google.protobuf.MessageOrBuilder {
+  }
+
+  /**
+   * Protobuf type {@code mongo.InsertResponse}
+   */
+  public static final class InsertResponse extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.InsertResponse)
+      InsertResponseOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use InsertResponse.newBuilder() to construct.
+    private InsertResponse(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private InsertResponse() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new InsertResponse();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_InsertResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_InsertResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.InsertResponse.class, mongo.Mongo.InsertResponse.Builder.class);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.InsertResponse)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.InsertResponse other = (mongo.Mongo.InsertResponse) obj;
+
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.InsertResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.InsertResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.InsertResponse prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.InsertResponse}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.InsertResponse)
+        mongo.Mongo.InsertResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_InsertResponse_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_InsertResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.InsertResponse.class, mongo.Mongo.InsertResponse.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.InsertResponse.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_InsertResponse_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.InsertResponse getDefaultInstanceForType() {
+        return mongo.Mongo.InsertResponse.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.InsertResponse build() {
+        mongo.Mongo.InsertResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.InsertResponse buildPartial() {
+        mongo.Mongo.InsertResponse result = new mongo.Mongo.InsertResponse(this);
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.InsertResponse) {
+          return mergeFrom((mongo.Mongo.InsertResponse) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.InsertResponse other) {
+        if (other == mongo.Mongo.InsertResponse.getDefaultInstance())
+          return this;
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.InsertResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.InsertResponse)
+    private static final mongo.Mongo.InsertResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.InsertResponse();
+    }
+
+    public static mongo.Mongo.InsertResponse getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public InsertResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.InsertResponse getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ReadRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.ReadRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    java.lang.String getCollection();
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    com.google.protobuf.ByteString getCollectionBytes();
+
+    /**
+     * string id = 2;
+     * 
+     * @return The id.
+     */
+    java.lang.String getId();
+
+    /**
+     * string id = 2;
+     * 
+     * @return The bytes for id.
+     */
+    com.google.protobuf.ByteString getIdBytes();
+
+    /**
+     * repeated string fields = 3;
+     * 
+     * @return A list containing the fields.
+     */
+    java.util.List getFieldsList();
+
+    /**
+     * repeated string fields = 3;
+     * 
+     * @return The count of fields.
+     */
+    int getFieldsCount();
+
+    /**
+     * repeated string fields = 3;
+     * 
+     * @param index The index of the element to return.
+     * @return The fields at the given index.
+     */
+    java.lang.String getFields(int index);
+
+    /**
+     * repeated string fields = 3;
+     * 
+     * @param index The index of the value to return.
+     * @return The bytes of the fields at the given index.
+     */
+    com.google.protobuf.ByteString getFieldsBytes(int index);
+  }
+
+  /**
+   * Protobuf type {@code mongo.ReadRequest}
+   */
+  public static final class ReadRequest extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.ReadRequest)
+      ReadRequestOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use ReadRequest.newBuilder() to construct.
+    private ReadRequest(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private ReadRequest() {
+      collection_ = "";
+      id_ = "";
+      fields_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ReadRequest();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_ReadRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_ReadRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.ReadRequest.class, mongo.Mongo.ReadRequest.Builder.class);
+    }
+
+    public static final int COLLECTION_FIELD_NUMBER = 1;
+    private volatile java.lang.Object collection_;
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    @java.lang.Override
+    public java.lang.String getCollection() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        collection_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getCollectionBytes() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        collection_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int ID_FIELD_NUMBER = 2;
+    private volatile java.lang.Object id_;
+
+    /**
+     * string id = 2;
+     * 
+     * @return The id.
+     */
+    @java.lang.Override
+    public java.lang.String getId() {
+      java.lang.Object ref = id_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        id_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string id = 2;
+     * 
+     * @return The bytes for id.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getIdBytes() {
+      java.lang.Object ref = id_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        id_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int FIELDS_FIELD_NUMBER = 3;
+    private com.google.protobuf.LazyStringList fields_;
+
+    /**
+     * repeated string fields = 3;
+     * 
+     * @return A list containing the fields.
+     */
+    public com.google.protobuf.ProtocolStringList getFieldsList() {
+      return fields_;
+    }
+
+    /**
+     * repeated string fields = 3;
+     * 
+     * @return The count of fields.
+     */
+    public int getFieldsCount() {
+      return fields_.size();
+    }
+
+    /**
+     * repeated string fields = 3;
+     * 
+     * @param index The index of the element to return.
+     * @return The fields at the given index.
+     */
+    public java.lang.String getFields(int index) {
+      return fields_.get(index);
+    }
+
+    /**
+     * repeated string fields = 3;
+     * 
+     * @param index The index of the value to return.
+     * @return The bytes of the fields at the given index.
+     */
+    public com.google.protobuf.ByteString getFieldsBytes(int index) {
+      return fields_.getByteString(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, collection_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, id_);
+      }
+      for (int i = 0; i < fields_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, fields_.getRaw(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, collection_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, id_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < fields_.size(); i++) {
+          dataSize += computeStringSizeNoTag(fields_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getFieldsList().size();
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.ReadRequest)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.ReadRequest other = (mongo.Mongo.ReadRequest) obj;
+
+      if (!getCollection()
+          .equals(other.getCollection()))
+        return false;
+      if (!getId()
+          .equals(other.getId()))
+        return false;
+      if (!getFieldsList()
+          .equals(other.getFieldsList()))
+        return false;
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + COLLECTION_FIELD_NUMBER;
+      hash = (53 * hash) + getCollection().hashCode();
+      hash = (37 * hash) + ID_FIELD_NUMBER;
+      hash = (53 * hash) + getId().hashCode();
+      if (getFieldsCount() > 0) {
+        hash = (37 * hash) + FIELDS_FIELD_NUMBER;
+        hash = (53 * hash) + getFieldsList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ReadRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ReadRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.ReadRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.ReadRequest}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.ReadRequest)
+        mongo.Mongo.ReadRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_ReadRequest_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_ReadRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.ReadRequest.class, mongo.Mongo.ReadRequest.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.ReadRequest.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        collection_ = "";
+
+        id_ = "";
+
+        fields_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_ReadRequest_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ReadRequest getDefaultInstanceForType() {
+        return mongo.Mongo.ReadRequest.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ReadRequest build() {
+        mongo.Mongo.ReadRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ReadRequest buildPartial() {
+        mongo.Mongo.ReadRequest result = new mongo.Mongo.ReadRequest(this);
+        int from_bitField0_ = bitField0_;
+        result.collection_ = collection_;
+        result.id_ = id_;
+        if (((bitField0_ & 0x00000001) != 0)) {
+          fields_ = fields_.getUnmodifiableView();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.fields_ = fields_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.ReadRequest) {
+          return mergeFrom((mongo.Mongo.ReadRequest) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.ReadRequest other) {
+        if (other == mongo.Mongo.ReadRequest.getDefaultInstance())
+          return this;
+        if (!other.getCollection().isEmpty()) {
+          collection_ = other.collection_;
+          onChanged();
+        }
+        if (!other.getId().isEmpty()) {
+          id_ = other.id_;
+          onChanged();
+        }
+        if (!other.fields_.isEmpty()) {
+          if (fields_.isEmpty()) {
+            fields_ = other.fields_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureFieldsIsMutable();
+            fields_.addAll(other.fields_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                collection_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 10
+              case 18: {
+                id_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 18
+              case 26: {
+                java.lang.String s = input.readStringRequireUtf8();
+                ensureFieldsIsMutable();
+                fields_.add(s);
+                break;
+              } // case 26
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.lang.Object collection_ = "";
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The collection.
+       */
+      public java.lang.String getCollection() {
+        java.lang.Object ref = collection_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          collection_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The bytes for collection.
+       */
+      public com.google.protobuf.ByteString getCollectionBytes() {
+        java.lang.Object ref = collection_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          collection_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollection(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearCollection() {
+
+        collection_ = getDefaultInstance().getCollection();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The bytes for collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollectionBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object id_ = "";
+
+      /**
+       * string id = 2;
+       * 
+       * @return The id.
+       */
+      public java.lang.String getId() {
+        java.lang.Object ref = id_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          id_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @return The bytes for id.
+       */
+      public com.google.protobuf.ByteString getIdBytes() {
+        java.lang.Object ref = id_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          id_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @param value The id to set.
+       * @return This builder for chaining.
+       */
+      public Builder setId(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        id_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearId() {
+
+        id_ = getDefaultInstance().getId();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @param value The bytes for id to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        id_ = value;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.LazyStringList fields_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+
+      private void ensureFieldsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          fields_ = new com.google.protobuf.LazyStringArrayList(fields_);
+          bitField0_ |= 0x00000001;
+        }
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @return A list containing the fields.
+       */
+      public com.google.protobuf.ProtocolStringList getFieldsList() {
+        return fields_.getUnmodifiableView();
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @return The count of fields.
+       */
+      public int getFieldsCount() {
+        return fields_.size();
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @param index The index of the element to return.
+       * @return The fields at the given index.
+       */
+      public java.lang.String getFields(int index) {
+        return fields_.get(index);
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @param index The index of the value to return.
+       * @return The bytes of the fields at the given index.
+       */
+      public com.google.protobuf.ByteString getFieldsBytes(int index) {
+        return fields_.getByteString(index);
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @param index The index to set the value at.
+       * @param value The fields to set.
+       * @return This builder for chaining.
+       */
+      public Builder setFields(
+          int index, java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureFieldsIsMutable();
+        fields_.set(index, value);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @param value The fields to add.
+       * @return This builder for chaining.
+       */
+      public Builder addFields(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureFieldsIsMutable();
+        fields_.add(value);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @param values The fields to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllFields(
+          java.lang.Iterable values) {
+        ensureFieldsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, fields_);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearFields() {
+        fields_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * repeated string fields = 3;
+       * 
+       * @param value The bytes of the fields to add.
+       * @return This builder for chaining.
+       */
+      public Builder addFieldsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        ensureFieldsIsMutable();
+        fields_.add(value);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.ReadRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.ReadRequest)
+    private static final mongo.Mongo.ReadRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.ReadRequest();
+    }
+
+    public static mongo.Mongo.ReadRequest getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public ReadRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.ReadRequest getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ReadResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.ReadResponse)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * .mongo.BSONDocument document = 1;
+     * 
+     * @return Whether the document field is set.
+     */
+    boolean hasDocument();
+
+    /**
+     * .mongo.BSONDocument document = 1;
+     * 
+     * @return The document.
+     */
+    mongo.Mongo.BSONDocument getDocument();
+
+    /**
+     * .mongo.BSONDocument document = 1;
+     */
+    mongo.Mongo.BSONDocumentOrBuilder getDocumentOrBuilder();
+  }
+
+  /**
+   * Protobuf type {@code mongo.ReadResponse}
+   */
+  public static final class ReadResponse extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.ReadResponse)
+      ReadResponseOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use ReadResponse.newBuilder() to construct.
+    private ReadResponse(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private ReadResponse() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ReadResponse();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_ReadResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_ReadResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.ReadResponse.class, mongo.Mongo.ReadResponse.Builder.class);
+    }
+
+    public static final int DOCUMENT_FIELD_NUMBER = 1;
+    private mongo.Mongo.BSONDocument document_;
+
+    /**
+     * .mongo.BSONDocument document = 1;
+     * 
+     * @return Whether the document field is set.
+     */
+    @java.lang.Override
+    public boolean hasDocument() {
+      return document_ != null;
+    }
+
+    /**
+     * .mongo.BSONDocument document = 1;
+     * 
+     * @return The document.
+     */
+    @java.lang.Override
+    public mongo.Mongo.BSONDocument getDocument() {
+      return document_ == null ? mongo.Mongo.BSONDocument.getDefaultInstance() : document_;
+    }
+
+    /**
+     * .mongo.BSONDocument document = 1;
+     */
+    @java.lang.Override
+    public mongo.Mongo.BSONDocumentOrBuilder getDocumentOrBuilder() {
+      return getDocument();
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (document_ != null) {
+        output.writeMessage(1, getDocument());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (document_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(1, getDocument());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.ReadResponse)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.ReadResponse other = (mongo.Mongo.ReadResponse) obj;
+
+      if (hasDocument() != other.hasDocument())
+        return false;
+      if (hasDocument()) {
+        if (!getDocument()
+            .equals(other.getDocument()))
+          return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasDocument()) {
+        hash = (37 * hash) + DOCUMENT_FIELD_NUMBER;
+        hash = (53 * hash) + getDocument().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ReadResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ReadResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.ReadResponse prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.ReadResponse}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.ReadResponse)
+        mongo.Mongo.ReadResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_ReadResponse_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_ReadResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.ReadResponse.class, mongo.Mongo.ReadResponse.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.ReadResponse.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (documentBuilder_ == null) {
+          document_ = null;
+        } else {
+          document_ = null;
+          documentBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_ReadResponse_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ReadResponse getDefaultInstanceForType() {
+        return mongo.Mongo.ReadResponse.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ReadResponse build() {
+        mongo.Mongo.ReadResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ReadResponse buildPartial() {
+        mongo.Mongo.ReadResponse result = new mongo.Mongo.ReadResponse(this);
+        if (documentBuilder_ == null) {
+          result.document_ = document_;
+        } else {
+          result.document_ = documentBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.ReadResponse) {
+          return mergeFrom((mongo.Mongo.ReadResponse) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.ReadResponse other) {
+        if (other == mongo.Mongo.ReadResponse.getDefaultInstance())
+          return this;
+        if (other.hasDocument()) {
+          mergeDocument(other.getDocument());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                input.readMessage(
+                    getDocumentFieldBuilder().getBuilder(),
+                    extensionRegistry);
+
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private mongo.Mongo.BSONDocument document_;
+      private com.google.protobuf.SingleFieldBuilderV3 documentBuilder_;
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       * 
+       * @return Whether the document field is set.
+       */
+      public boolean hasDocument() {
+        return documentBuilder_ != null || document_ != null;
+      }
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       * 
+       * @return The document.
+       */
+      public mongo.Mongo.BSONDocument getDocument() {
+        if (documentBuilder_ == null) {
+          return document_ == null ? mongo.Mongo.BSONDocument.getDefaultInstance() : document_;
+        } else {
+          return documentBuilder_.getMessage();
+        }
+      }
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       */
+      public Builder setDocument(mongo.Mongo.BSONDocument value) {
+        if (documentBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          document_ = value;
+          onChanged();
+        } else {
+          documentBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       */
+      public Builder setDocument(
+          mongo.Mongo.BSONDocument.Builder builderForValue) {
+        if (documentBuilder_ == null) {
+          document_ = builderForValue.build();
+          onChanged();
+        } else {
+          documentBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       */
+      public Builder mergeDocument(mongo.Mongo.BSONDocument value) {
+        if (documentBuilder_ == null) {
+          if (document_ != null) {
+            document_ = mongo.Mongo.BSONDocument.newBuilder(document_).mergeFrom(value).buildPartial();
+          } else {
+            document_ = value;
+          }
+          onChanged();
+        } else {
+          documentBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       */
+      public Builder clearDocument() {
+        if (documentBuilder_ == null) {
+          document_ = null;
+          onChanged();
+        } else {
+          document_ = null;
+          documentBuilder_ = null;
+        }
+
+        return this;
+      }
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       */
+      public mongo.Mongo.BSONDocument.Builder getDocumentBuilder() {
+
+        onChanged();
+        return getDocumentFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       */
+      public mongo.Mongo.BSONDocumentOrBuilder getDocumentOrBuilder() {
+        if (documentBuilder_ != null) {
+          return documentBuilder_.getMessageOrBuilder();
+        } else {
+          return document_ == null ? mongo.Mongo.BSONDocument.getDefaultInstance() : document_;
+        }
+      }
+
+      /**
+       * .mongo.BSONDocument document = 1;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getDocumentFieldBuilder() {
+        if (documentBuilder_ == null) {
+          documentBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              getDocument(),
+              getParentForChildren(),
+              isClean());
+          document_ = null;
+        }
+        return documentBuilder_;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.ReadResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.ReadResponse)
+    private static final mongo.Mongo.ReadResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.ReadResponse();
+    }
+
+    public static mongo.Mongo.ReadResponse getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public ReadResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.ReadResponse getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ScanRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.ScanRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    java.lang.String getCollection();
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    com.google.protobuf.ByteString getCollectionBytes();
+
+    /**
+     * string startkey = 2;
+     * 
+     * @return The startkey.
+     */
+    java.lang.String getStartkey();
+
+    /**
+     * string startkey = 2;
+     * 
+     * @return The bytes for startkey.
+     */
+    com.google.protobuf.ByteString getStartkeyBytes();
+
+    /**
+     * int32 recordcount = 3;
+     * 
+     * @return The recordcount.
+     */
+    int getRecordcount();
+
+    /**
+     * repeated string fields = 4;
+     * 
+     * @return A list containing the fields.
+     */
+    java.util.List getFieldsList();
+
+    /**
+     * repeated string fields = 4;
+     * 
+     * @return The count of fields.
+     */
+    int getFieldsCount();
+
+    /**
+     * repeated string fields = 4;
+     * 
+     * @param index The index of the element to return.
+     * @return The fields at the given index.
+     */
+    java.lang.String getFields(int index);
+
+    /**
+     * repeated string fields = 4;
+     * 
+     * @param index The index of the value to return.
+     * @return The bytes of the fields at the given index.
+     */
+    com.google.protobuf.ByteString getFieldsBytes(int index);
+  }
+
+  /**
+   * Protobuf type {@code mongo.ScanRequest}
+   */
+  public static final class ScanRequest extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.ScanRequest)
+      ScanRequestOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use ScanRequest.newBuilder() to construct.
+    private ScanRequest(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private ScanRequest() {
+      collection_ = "";
+      startkey_ = "";
+      fields_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ScanRequest();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_ScanRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_ScanRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.ScanRequest.class, mongo.Mongo.ScanRequest.Builder.class);
+    }
+
+    public static final int COLLECTION_FIELD_NUMBER = 1;
+    private volatile java.lang.Object collection_;
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    @java.lang.Override
+    public java.lang.String getCollection() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        collection_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getCollectionBytes() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        collection_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int STARTKEY_FIELD_NUMBER = 2;
+    private volatile java.lang.Object startkey_;
+
+    /**
+     * string startkey = 2;
+     * 
+     * @return The startkey.
+     */
+    @java.lang.Override
+    public java.lang.String getStartkey() {
+      java.lang.Object ref = startkey_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        startkey_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string startkey = 2;
+     * 
+     * @return The bytes for startkey.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getStartkeyBytes() {
+      java.lang.Object ref = startkey_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        startkey_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int RECORDCOUNT_FIELD_NUMBER = 3;
+    private int recordcount_;
+
+    /**
+     * int32 recordcount = 3;
+     * 
+     * @return The recordcount.
+     */
+    @java.lang.Override
+    public int getRecordcount() {
+      return recordcount_;
+    }
+
+    public static final int FIELDS_FIELD_NUMBER = 4;
+    private com.google.protobuf.LazyStringList fields_;
+
+    /**
+     * repeated string fields = 4;
+     * 
+     * @return A list containing the fields.
+     */
+    public com.google.protobuf.ProtocolStringList getFieldsList() {
+      return fields_;
+    }
+
+    /**
+     * repeated string fields = 4;
+     * 
+     * @return The count of fields.
+     */
+    public int getFieldsCount() {
+      return fields_.size();
+    }
+
+    /**
+     * repeated string fields = 4;
+     * 
+     * @param index The index of the element to return.
+     * @return The fields at the given index.
+     */
+    public java.lang.String getFields(int index) {
+      return fields_.get(index);
+    }
+
+    /**
+     * repeated string fields = 4;
+     * 
+     * @param index The index of the value to return.
+     * @return The bytes of the fields at the given index.
+     */
+    public com.google.protobuf.ByteString getFieldsBytes(int index) {
+      return fields_.getByteString(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, collection_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(startkey_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, startkey_);
+      }
+      if (recordcount_ != 0) {
+        output.writeInt32(3, recordcount_);
+      }
+      for (int i = 0; i < fields_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, fields_.getRaw(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, collection_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(startkey_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, startkey_);
+      }
+      if (recordcount_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(3, recordcount_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < fields_.size(); i++) {
+          dataSize += computeStringSizeNoTag(fields_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getFieldsList().size();
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.ScanRequest)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.ScanRequest other = (mongo.Mongo.ScanRequest) obj;
+
+      if (!getCollection()
+          .equals(other.getCollection()))
+        return false;
+      if (!getStartkey()
+          .equals(other.getStartkey()))
+        return false;
+      if (getRecordcount() != other.getRecordcount())
+        return false;
+      if (!getFieldsList()
+          .equals(other.getFieldsList()))
+        return false;
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + COLLECTION_FIELD_NUMBER;
+      hash = (53 * hash) + getCollection().hashCode();
+      hash = (37 * hash) + STARTKEY_FIELD_NUMBER;
+      hash = (53 * hash) + getStartkey().hashCode();
+      hash = (37 * hash) + RECORDCOUNT_FIELD_NUMBER;
+      hash = (53 * hash) + getRecordcount();
+      if (getFieldsCount() > 0) {
+        hash = (37 * hash) + FIELDS_FIELD_NUMBER;
+        hash = (53 * hash) + getFieldsList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ScanRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ScanRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.ScanRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.ScanRequest}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.ScanRequest)
+        mongo.Mongo.ScanRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_ScanRequest_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_ScanRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.ScanRequest.class, mongo.Mongo.ScanRequest.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.ScanRequest.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        collection_ = "";
+
+        startkey_ = "";
+
+        recordcount_ = 0;
+
+        fields_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_ScanRequest_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ScanRequest getDefaultInstanceForType() {
+        return mongo.Mongo.ScanRequest.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ScanRequest build() {
+        mongo.Mongo.ScanRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ScanRequest buildPartial() {
+        mongo.Mongo.ScanRequest result = new mongo.Mongo.ScanRequest(this);
+        int from_bitField0_ = bitField0_;
+        result.collection_ = collection_;
+        result.startkey_ = startkey_;
+        result.recordcount_ = recordcount_;
+        if (((bitField0_ & 0x00000001) != 0)) {
+          fields_ = fields_.getUnmodifiableView();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.fields_ = fields_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.ScanRequest) {
+          return mergeFrom((mongo.Mongo.ScanRequest) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.ScanRequest other) {
+        if (other == mongo.Mongo.ScanRequest.getDefaultInstance())
+          return this;
+        if (!other.getCollection().isEmpty()) {
+          collection_ = other.collection_;
+          onChanged();
+        }
+        if (!other.getStartkey().isEmpty()) {
+          startkey_ = other.startkey_;
+          onChanged();
+        }
+        if (other.getRecordcount() != 0) {
+          setRecordcount(other.getRecordcount());
+        }
+        if (!other.fields_.isEmpty()) {
+          if (fields_.isEmpty()) {
+            fields_ = other.fields_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureFieldsIsMutable();
+            fields_.addAll(other.fields_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                collection_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 10
+              case 18: {
+                startkey_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 18
+              case 24: {
+                recordcount_ = input.readInt32();
+
+                break;
+              } // case 24
+              case 34: {
+                java.lang.String s = input.readStringRequireUtf8();
+                ensureFieldsIsMutable();
+                fields_.add(s);
+                break;
+              } // case 34
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.lang.Object collection_ = "";
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The collection.
+       */
+      public java.lang.String getCollection() {
+        java.lang.Object ref = collection_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          collection_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The bytes for collection.
+       */
+      public com.google.protobuf.ByteString getCollectionBytes() {
+        java.lang.Object ref = collection_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          collection_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollection(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearCollection() {
+
+        collection_ = getDefaultInstance().getCollection();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The bytes for collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollectionBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object startkey_ = "";
+
+      /**
+       * string startkey = 2;
+       * 
+       * @return The startkey.
+       */
+      public java.lang.String getStartkey() {
+        java.lang.Object ref = startkey_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          startkey_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string startkey = 2;
+       * 
+       * @return The bytes for startkey.
+       */
+      public com.google.protobuf.ByteString getStartkeyBytes() {
+        java.lang.Object ref = startkey_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          startkey_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string startkey = 2;
+       * 
+       * @param value The startkey to set.
+       * @return This builder for chaining.
+       */
+      public Builder setStartkey(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        startkey_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string startkey = 2;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearStartkey() {
+
+        startkey_ = getDefaultInstance().getStartkey();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string startkey = 2;
+       * 
+       * @param value The bytes for startkey to set.
+       * @return This builder for chaining.
+       */
+      public Builder setStartkeyBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        startkey_ = value;
+        onChanged();
+        return this;
+      }
+
+      private int recordcount_;
+
+      /**
+       * int32 recordcount = 3;
+       * 
+       * @return The recordcount.
+       */
+      @java.lang.Override
+      public int getRecordcount() {
+        return recordcount_;
+      }
+
+      /**
+       * int32 recordcount = 3;
+       * 
+       * @param value The recordcount to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRecordcount(int value) {
+
+        recordcount_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * int32 recordcount = 3;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearRecordcount() {
+
+        recordcount_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.LazyStringList fields_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+
+      private void ensureFieldsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          fields_ = new com.google.protobuf.LazyStringArrayList(fields_);
+          bitField0_ |= 0x00000001;
+        }
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @return A list containing the fields.
+       */
+      public com.google.protobuf.ProtocolStringList getFieldsList() {
+        return fields_.getUnmodifiableView();
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @return The count of fields.
+       */
+      public int getFieldsCount() {
+        return fields_.size();
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @param index The index of the element to return.
+       * @return The fields at the given index.
+       */
+      public java.lang.String getFields(int index) {
+        return fields_.get(index);
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @param index The index of the value to return.
+       * @return The bytes of the fields at the given index.
+       */
+      public com.google.protobuf.ByteString getFieldsBytes(int index) {
+        return fields_.getByteString(index);
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @param index The index to set the value at.
+       * @param value The fields to set.
+       * @return This builder for chaining.
+       */
+      public Builder setFields(
+          int index, java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureFieldsIsMutable();
+        fields_.set(index, value);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @param value The fields to add.
+       * @return This builder for chaining.
+       */
+      public Builder addFields(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureFieldsIsMutable();
+        fields_.add(value);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @param values The fields to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllFields(
+          java.lang.Iterable values) {
+        ensureFieldsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, fields_);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearFields() {
+        fields_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * repeated string fields = 4;
+       * 
+       * @param value The bytes of the fields to add.
+       * @return This builder for chaining.
+       */
+      public Builder addFieldsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        ensureFieldsIsMutable();
+        fields_.add(value);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.ScanRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.ScanRequest)
+    private static final mongo.Mongo.ScanRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.ScanRequest();
+    }
+
+    public static mongo.Mongo.ScanRequest getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public ScanRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.ScanRequest getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ScanResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.ScanResponse)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    java.util.List getDocumentsList();
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    mongo.Mongo.BSONDocument getDocuments(int index);
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    int getDocumentsCount();
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    java.util.List extends mongo.Mongo.BSONDocumentOrBuilder> getDocumentsOrBuilderList();
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    mongo.Mongo.BSONDocumentOrBuilder getDocumentsOrBuilder(
+        int index);
+  }
+
+  /**
+   * Protobuf type {@code mongo.ScanResponse}
+   */
+  public static final class ScanResponse extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.ScanResponse)
+      ScanResponseOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use ScanResponse.newBuilder() to construct.
+    private ScanResponse(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private ScanResponse() {
+      documents_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ScanResponse();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_ScanResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_ScanResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.ScanResponse.class, mongo.Mongo.ScanResponse.Builder.class);
+    }
+
+    public static final int DOCUMENTS_FIELD_NUMBER = 1;
+    private java.util.List documents_;
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    @java.lang.Override
+    public java.util.List getDocumentsList() {
+      return documents_;
+    }
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    @java.lang.Override
+    public java.util.List extends mongo.Mongo.BSONDocumentOrBuilder> getDocumentsOrBuilderList() {
+      return documents_;
+    }
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    @java.lang.Override
+    public int getDocumentsCount() {
+      return documents_.size();
+    }
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    @java.lang.Override
+    public mongo.Mongo.BSONDocument getDocuments(int index) {
+      return documents_.get(index);
+    }
+
+    /**
+     * repeated .mongo.BSONDocument documents = 1;
+     */
+    @java.lang.Override
+    public mongo.Mongo.BSONDocumentOrBuilder getDocumentsOrBuilder(
+        int index) {
+      return documents_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      for (int i = 0; i < documents_.size(); i++) {
+        output.writeMessage(1, documents_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      for (int i = 0; i < documents_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(1, documents_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.ScanResponse)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.ScanResponse other = (mongo.Mongo.ScanResponse) obj;
+
+      if (!getDocumentsList()
+          .equals(other.getDocumentsList()))
+        return false;
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getDocumentsCount() > 0) {
+        hash = (37 * hash) + DOCUMENTS_FIELD_NUMBER;
+        hash = (53 * hash) + getDocumentsList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ScanResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.ScanResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.ScanResponse prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.ScanResponse}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.ScanResponse)
+        mongo.Mongo.ScanResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_ScanResponse_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_ScanResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.ScanResponse.class, mongo.Mongo.ScanResponse.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.ScanResponse.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (documentsBuilder_ == null) {
+          documents_ = java.util.Collections.emptyList();
+        } else {
+          documents_ = null;
+          documentsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_ScanResponse_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ScanResponse getDefaultInstanceForType() {
+        return mongo.Mongo.ScanResponse.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ScanResponse build() {
+        mongo.Mongo.ScanResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.ScanResponse buildPartial() {
+        mongo.Mongo.ScanResponse result = new mongo.Mongo.ScanResponse(this);
+        int from_bitField0_ = bitField0_;
+        if (documentsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            documents_ = java.util.Collections.unmodifiableList(documents_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.documents_ = documents_;
+        } else {
+          result.documents_ = documentsBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.ScanResponse) {
+          return mergeFrom((mongo.Mongo.ScanResponse) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.ScanResponse other) {
+        if (other == mongo.Mongo.ScanResponse.getDefaultInstance())
+          return this;
+        if (documentsBuilder_ == null) {
+          if (!other.documents_.isEmpty()) {
+            if (documents_.isEmpty()) {
+              documents_ = other.documents_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureDocumentsIsMutable();
+              documents_.addAll(other.documents_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.documents_.isEmpty()) {
+            if (documentsBuilder_.isEmpty()) {
+              documentsBuilder_.dispose();
+              documentsBuilder_ = null;
+              documents_ = other.documents_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              documentsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders
+                  ? getDocumentsFieldBuilder()
+                  : null;
+            } else {
+              documentsBuilder_.addAllMessages(other.documents_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                mongo.Mongo.BSONDocument m = input.readMessage(
+                    mongo.Mongo.BSONDocument.parser(),
+                    extensionRegistry);
+                if (documentsBuilder_ == null) {
+                  ensureDocumentsIsMutable();
+                  documents_.add(m);
+                } else {
+                  documentsBuilder_.addMessage(m);
+                }
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.util.List documents_ = java.util.Collections.emptyList();
+
+      private void ensureDocumentsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          documents_ = new java.util.ArrayList(documents_);
+          bitField0_ |= 0x00000001;
+        }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3 documentsBuilder_;
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public java.util.List getDocumentsList() {
+        if (documentsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(documents_);
+        } else {
+          return documentsBuilder_.getMessageList();
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public int getDocumentsCount() {
+        if (documentsBuilder_ == null) {
+          return documents_.size();
+        } else {
+          return documentsBuilder_.getCount();
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public mongo.Mongo.BSONDocument getDocuments(int index) {
+        if (documentsBuilder_ == null) {
+          return documents_.get(index);
+        } else {
+          return documentsBuilder_.getMessage(index);
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder setDocuments(
+          int index, mongo.Mongo.BSONDocument value) {
+        if (documentsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDocumentsIsMutable();
+          documents_.set(index, value);
+          onChanged();
+        } else {
+          documentsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder setDocuments(
+          int index, mongo.Mongo.BSONDocument.Builder builderForValue) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          documents_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          documentsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder addDocuments(mongo.Mongo.BSONDocument value) {
+        if (documentsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDocumentsIsMutable();
+          documents_.add(value);
+          onChanged();
+        } else {
+          documentsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder addDocuments(
+          int index, mongo.Mongo.BSONDocument value) {
+        if (documentsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDocumentsIsMutable();
+          documents_.add(index, value);
+          onChanged();
+        } else {
+          documentsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder addDocuments(
+          mongo.Mongo.BSONDocument.Builder builderForValue) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          documents_.add(builderForValue.build());
+          onChanged();
+        } else {
+          documentsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder addDocuments(
+          int index, mongo.Mongo.BSONDocument.Builder builderForValue) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          documents_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          documentsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder addAllDocuments(
+          java.lang.Iterable extends mongo.Mongo.BSONDocument> values) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, documents_);
+          onChanged();
+        } else {
+          documentsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder clearDocuments() {
+        if (documentsBuilder_ == null) {
+          documents_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          documentsBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public Builder removeDocuments(int index) {
+        if (documentsBuilder_ == null) {
+          ensureDocumentsIsMutable();
+          documents_.remove(index);
+          onChanged();
+        } else {
+          documentsBuilder_.remove(index);
+        }
+        return this;
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public mongo.Mongo.BSONDocument.Builder getDocumentsBuilder(
+          int index) {
+        return getDocumentsFieldBuilder().getBuilder(index);
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public mongo.Mongo.BSONDocumentOrBuilder getDocumentsOrBuilder(
+          int index) {
+        if (documentsBuilder_ == null) {
+          return documents_.get(index);
+        } else {
+          return documentsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public java.util.List extends mongo.Mongo.BSONDocumentOrBuilder> getDocumentsOrBuilderList() {
+        if (documentsBuilder_ != null) {
+          return documentsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(documents_);
+        }
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public mongo.Mongo.BSONDocument.Builder addDocumentsBuilder() {
+        return getDocumentsFieldBuilder().addBuilder(
+            mongo.Mongo.BSONDocument.getDefaultInstance());
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public mongo.Mongo.BSONDocument.Builder addDocumentsBuilder(
+          int index) {
+        return getDocumentsFieldBuilder().addBuilder(
+            index, mongo.Mongo.BSONDocument.getDefaultInstance());
+      }
+
+      /**
+       * repeated .mongo.BSONDocument documents = 1;
+       */
+      public java.util.List getDocumentsBuilderList() {
+        return getDocumentsFieldBuilder().getBuilderList();
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3 getDocumentsFieldBuilder() {
+        if (documentsBuilder_ == null) {
+          documentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(
+              documents_,
+              ((bitField0_ & 0x00000001) != 0),
+              getParentForChildren(),
+              isClean());
+          documents_ = null;
+        }
+        return documentsBuilder_;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.ScanResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.ScanResponse)
+    private static final mongo.Mongo.ScanResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.ScanResponse();
+    }
+
+    public static mongo.Mongo.ScanResponse getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public ScanResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.ScanResponse getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface UpdateRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.UpdateRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    java.lang.String getCollection();
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    com.google.protobuf.ByteString getCollectionBytes();
+
+    /**
+     * string id = 2;
+     * 
+     * @return The id.
+     */
+    java.lang.String getId();
+
+    /**
+     * string id = 2;
+     * 
+     * @return The bytes for id.
+     */
+    com.google.protobuf.ByteString getIdBytes();
+
+    /**
+     * .mongo.BSONDocument updateDocument = 3;
+     * 
+     * @return Whether the updateDocument field is set.
+     */
+    boolean hasUpdateDocument();
+
+    /**
+     * .mongo.BSONDocument updateDocument = 3;
+     * 
+     * @return The updateDocument.
+     */
+    mongo.Mongo.BSONDocument getUpdateDocument();
+
+    /**
+     * .mongo.BSONDocument updateDocument = 3;
+     */
+    mongo.Mongo.BSONDocumentOrBuilder getUpdateDocumentOrBuilder();
+  }
+
+  /**
+   * Protobuf type {@code mongo.UpdateRequest}
+   */
+  public static final class UpdateRequest extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.UpdateRequest)
+      UpdateRequestOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use UpdateRequest.newBuilder() to construct.
+    private UpdateRequest(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private UpdateRequest() {
+      collection_ = "";
+      id_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new UpdateRequest();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_UpdateRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_UpdateRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.UpdateRequest.class, mongo.Mongo.UpdateRequest.Builder.class);
+    }
+
+    public static final int COLLECTION_FIELD_NUMBER = 1;
+    private volatile java.lang.Object collection_;
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The collection.
+     */
+    @java.lang.Override
+    public java.lang.String getCollection() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        collection_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string collection = 1;
+     * 
+     * @return The bytes for collection.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getCollectionBytes() {
+      java.lang.Object ref = collection_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        collection_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int ID_FIELD_NUMBER = 2;
+    private volatile java.lang.Object id_;
+
+    /**
+     * string id = 2;
+     * 
+     * @return The id.
+     */
+    @java.lang.Override
+    public java.lang.String getId() {
+      java.lang.Object ref = id_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        id_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * string id = 2;
+     * 
+     * @return The bytes for id.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getIdBytes() {
+      java.lang.Object ref = id_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+            (java.lang.String) ref);
+        id_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int UPDATEDOCUMENT_FIELD_NUMBER = 3;
+    private mongo.Mongo.BSONDocument updateDocument_;
+
+    /**
+     * .mongo.BSONDocument updateDocument = 3;
+     * 
+     * @return Whether the updateDocument field is set.
+     */
+    @java.lang.Override
+    public boolean hasUpdateDocument() {
+      return updateDocument_ != null;
+    }
+
+    /**
+     * .mongo.BSONDocument updateDocument = 3;
+     * 
+     * @return The updateDocument.
+     */
+    @java.lang.Override
+    public mongo.Mongo.BSONDocument getUpdateDocument() {
+      return updateDocument_ == null ? mongo.Mongo.BSONDocument.getDefaultInstance() : updateDocument_;
+    }
+
+    /**
+     * .mongo.BSONDocument updateDocument = 3;
+     */
+    @java.lang.Override
+    public mongo.Mongo.BSONDocumentOrBuilder getUpdateDocumentOrBuilder() {
+      return getUpdateDocument();
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, collection_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, id_);
+      }
+      if (updateDocument_ != null) {
+        output.writeMessage(3, getUpdateDocument());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(collection_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, collection_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, id_);
+      }
+      if (updateDocument_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(3, getUpdateDocument());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.UpdateRequest)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.UpdateRequest other = (mongo.Mongo.UpdateRequest) obj;
+
+      if (!getCollection()
+          .equals(other.getCollection()))
+        return false;
+      if (!getId()
+          .equals(other.getId()))
+        return false;
+      if (hasUpdateDocument() != other.hasUpdateDocument())
+        return false;
+      if (hasUpdateDocument()) {
+        if (!getUpdateDocument()
+            .equals(other.getUpdateDocument()))
+          return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + COLLECTION_FIELD_NUMBER;
+      hash = (53 * hash) + getCollection().hashCode();
+      hash = (37 * hash) + ID_FIELD_NUMBER;
+      hash = (53 * hash) + getId().hashCode();
+      if (hasUpdateDocument()) {
+        hash = (37 * hash) + UPDATEDOCUMENT_FIELD_NUMBER;
+        hash = (53 * hash) + getUpdateDocument().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.UpdateRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.UpdateRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.UpdateRequest}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.UpdateRequest)
+        mongo.Mongo.UpdateRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_UpdateRequest_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_UpdateRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.UpdateRequest.class, mongo.Mongo.UpdateRequest.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.UpdateRequest.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        collection_ = "";
+
+        id_ = "";
+
+        if (updateDocumentBuilder_ == null) {
+          updateDocument_ = null;
+        } else {
+          updateDocument_ = null;
+          updateDocumentBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_UpdateRequest_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.UpdateRequest getDefaultInstanceForType() {
+        return mongo.Mongo.UpdateRequest.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.UpdateRequest build() {
+        mongo.Mongo.UpdateRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.UpdateRequest buildPartial() {
+        mongo.Mongo.UpdateRequest result = new mongo.Mongo.UpdateRequest(this);
+        result.collection_ = collection_;
+        result.id_ = id_;
+        if (updateDocumentBuilder_ == null) {
+          result.updateDocument_ = updateDocument_;
+        } else {
+          result.updateDocument_ = updateDocumentBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.UpdateRequest) {
+          return mergeFrom((mongo.Mongo.UpdateRequest) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.UpdateRequest other) {
+        if (other == mongo.Mongo.UpdateRequest.getDefaultInstance())
+          return this;
+        if (!other.getCollection().isEmpty()) {
+          collection_ = other.collection_;
+          onChanged();
+        }
+        if (!other.getId().isEmpty()) {
+          id_ = other.id_;
+          onChanged();
+        }
+        if (other.hasUpdateDocument()) {
+          mergeUpdateDocument(other.getUpdateDocument());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                collection_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 10
+              case 18: {
+                id_ = input.readStringRequireUtf8();
+
+                break;
+              } // case 18
+              case 26: {
+                input.readMessage(
+                    getUpdateDocumentFieldBuilder().getBuilder(),
+                    extensionRegistry);
+
+                break;
+              } // case 26
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private java.lang.Object collection_ = "";
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The collection.
+       */
+      public java.lang.String getCollection() {
+        java.lang.Object ref = collection_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          collection_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return The bytes for collection.
+       */
+      public com.google.protobuf.ByteString getCollectionBytes() {
+        java.lang.Object ref = collection_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          collection_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollection(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearCollection() {
+
+        collection_ = getDefaultInstance().getCollection();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string collection = 1;
+       * 
+       * @param value The bytes for collection to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCollectionBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        collection_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object id_ = "";
+
+      /**
+       * string id = 2;
+       * 
+       * @return The id.
+       */
+      public java.lang.String getId() {
+        java.lang.Object ref = id_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          id_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @return The bytes for id.
+       */
+      public com.google.protobuf.ByteString getIdBytes() {
+        java.lang.Object ref = id_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+          id_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @param value The id to set.
+       * @return This builder for chaining.
+       */
+      public Builder setId(
+          java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        id_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @return This builder for chaining.
+       */
+      public Builder clearId() {
+
+        id_ = getDefaultInstance().getId();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * string id = 2;
+       * 
+       * @param value The bytes for id to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        id_ = value;
+        onChanged();
+        return this;
+      }
+
+      private mongo.Mongo.BSONDocument updateDocument_;
+      private com.google.protobuf.SingleFieldBuilderV3 updateDocumentBuilder_;
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       * 
+       * @return Whether the updateDocument field is set.
+       */
+      public boolean hasUpdateDocument() {
+        return updateDocumentBuilder_ != null || updateDocument_ != null;
+      }
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       * 
+       * @return The updateDocument.
+       */
+      public mongo.Mongo.BSONDocument getUpdateDocument() {
+        if (updateDocumentBuilder_ == null) {
+          return updateDocument_ == null ? mongo.Mongo.BSONDocument.getDefaultInstance() : updateDocument_;
+        } else {
+          return updateDocumentBuilder_.getMessage();
+        }
+      }
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       */
+      public Builder setUpdateDocument(mongo.Mongo.BSONDocument value) {
+        if (updateDocumentBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          updateDocument_ = value;
+          onChanged();
+        } else {
+          updateDocumentBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       */
+      public Builder setUpdateDocument(
+          mongo.Mongo.BSONDocument.Builder builderForValue) {
+        if (updateDocumentBuilder_ == null) {
+          updateDocument_ = builderForValue.build();
+          onChanged();
+        } else {
+          updateDocumentBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       */
+      public Builder mergeUpdateDocument(mongo.Mongo.BSONDocument value) {
+        if (updateDocumentBuilder_ == null) {
+          if (updateDocument_ != null) {
+            updateDocument_ = mongo.Mongo.BSONDocument.newBuilder(updateDocument_).mergeFrom(value).buildPartial();
+          } else {
+            updateDocument_ = value;
+          }
+          onChanged();
+        } else {
+          updateDocumentBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       */
+      public Builder clearUpdateDocument() {
+        if (updateDocumentBuilder_ == null) {
+          updateDocument_ = null;
+          onChanged();
+        } else {
+          updateDocument_ = null;
+          updateDocumentBuilder_ = null;
+        }
+
+        return this;
+      }
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       */
+      public mongo.Mongo.BSONDocument.Builder getUpdateDocumentBuilder() {
+
+        onChanged();
+        return getUpdateDocumentFieldBuilder().getBuilder();
+      }
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       */
+      public mongo.Mongo.BSONDocumentOrBuilder getUpdateDocumentOrBuilder() {
+        if (updateDocumentBuilder_ != null) {
+          return updateDocumentBuilder_.getMessageOrBuilder();
+        } else {
+          return updateDocument_ == null ? mongo.Mongo.BSONDocument.getDefaultInstance() : updateDocument_;
+        }
+      }
+
+      /**
+       * .mongo.BSONDocument updateDocument = 3;
+       */
+      private com.google.protobuf.SingleFieldBuilderV3 getUpdateDocumentFieldBuilder() {
+        if (updateDocumentBuilder_ == null) {
+          updateDocumentBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(
+              getUpdateDocument(),
+              getParentForChildren(),
+              isClean());
+          updateDocument_ = null;
+        }
+        return updateDocumentBuilder_;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.UpdateRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.UpdateRequest)
+    private static final mongo.Mongo.UpdateRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.UpdateRequest();
+    }
+
+    public static mongo.Mongo.UpdateRequest getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public UpdateRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.UpdateRequest getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface UpdateResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:mongo.UpdateResponse)
+      com.google.protobuf.MessageOrBuilder {
+  }
+
+  /**
+   * Protobuf type {@code mongo.UpdateResponse}
+   */
+  public static final class UpdateResponse extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:mongo.UpdateResponse)
+      UpdateResponseOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use UpdateResponse.newBuilder() to construct.
+    private UpdateResponse(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+      super(builder);
+    }
+
+    private UpdateResponse() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({ "unused" })
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new UpdateResponse();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return mongo.Mongo.internal_static_mongo_UpdateResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+      return mongo.Mongo.internal_static_mongo_UpdateResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              mongo.Mongo.UpdateResponse.class, mongo.Mongo.UpdateResponse.Builder.class);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1)
+        return true;
+      if (isInitialized == 0)
+        return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1)
+        return size;
+
+      size = 0;
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof mongo.Mongo.UpdateResponse)) {
+        return super.equals(obj);
+      }
+      mongo.Mongo.UpdateResponse other = (mongo.Mongo.UpdateResponse) obj;
+
+      if (!getUnknownFields().equals(other.getUnknownFields()))
+        return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static mongo.Mongo.UpdateResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(mongo.Mongo.UpdateResponse prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder()
+          : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code mongo.UpdateResponse}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder implements
+        // @@protoc_insertion_point(builder_implements:mongo.UpdateResponse)
+        mongo.Mongo.UpdateResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return mongo.Mongo.internal_static_mongo_UpdateResponse_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+        return mongo.Mongo.internal_static_mongo_UpdateResponse_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                mongo.Mongo.UpdateResponse.class, mongo.Mongo.UpdateResponse.Builder.class);
+      }
+
+      // Construct using mongo.Mongo.UpdateResponse.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return mongo.Mongo.internal_static_mongo_UpdateResponse_descriptor;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.UpdateResponse getDefaultInstanceForType() {
+        return mongo.Mongo.UpdateResponse.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.UpdateResponse build() {
+        mongo.Mongo.UpdateResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public mongo.Mongo.UpdateResponse buildPartial() {
+        mongo.Mongo.UpdateResponse result = new mongo.Mongo.UpdateResponse(this);
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof mongo.Mongo.UpdateResponse) {
+          return mergeFrom((mongo.Mongo.UpdateResponse) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(mongo.Mongo.UpdateResponse other) {
+        if (other == mongo.Mongo.UpdateResponse.getDefaultInstance())
+          return this;
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:mongo.UpdateResponse)
+    }
+
+    // @@protoc_insertion_point(class_scope:mongo.UpdateResponse)
+    private static final mongo.Mongo.UpdateResponse DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new mongo.Mongo.UpdateResponse();
+    }
+
+    public static mongo.Mongo.UpdateResponse getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+      @java.lang.Override
+      public UpdateResponse parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public mongo.Mongo.UpdateResponse getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_MongoRequest_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_MongoRequest_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_MongoResponse_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_MongoResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_CleanupRequest_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_CleanupRequest_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_CleanupResponse_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_CleanupResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_DeleteRequest_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_DeleteRequest_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_DeleteResponse_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_DeleteResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_InsertRequest_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_InsertRequest_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_BSONDocument_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_BSONDocument_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_InsertResponse_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_InsertResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_ReadRequest_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_ReadRequest_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_ReadResponse_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_ReadResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_ScanRequest_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_ScanRequest_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_ScanResponse_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_ScanResponse_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_UpdateRequest_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_UpdateRequest_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor internal_static_mongo_UpdateResponse_descriptor;
+  private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_mongo_UpdateResponse_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
+    return descriptor;
+  }
+
+  private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+        "\n\013mongo.proto\022\005mongo\"\206\003\n\014MongoRequest\022-\n" +
+            "\004type\030\001 \001(\0162\037.mongo.MongoRequest.Request" +
+            "Type\022(\n\007cleanup\030\002 \001(\0132\025.mongo.CleanupReq" +
+            "uestH\000\022&\n\006delete\030\003 \001(\0132\024.mongo.DeleteReq" +
+            "uestH\000\022&\n\006insert\030\004 \001(\0132\024.mongo.InsertReq" +
+            "uestH\000\022\"\n\004read\030\005 \001(\0132\022.mongo.ReadRequest" +
+            "H\000\022\"\n\004scan\030\006 \001(\0132\022.mongo.ScanRequestH\000\022&" +
+            "\n\006update\030\007 \001(\0132\024.mongo.UpdateRequestH\000\"R" +
+            "\n\013RequestType\022\013\n\007CLEANUP\020\000\022\n\n\006DELETE\020\001\022\n" +
+            "\n\006INSERT\020\002\022\010\n\004READ\020\003\022\010\n\004SCAN\020\004\022\n\n\006UPDATE" +
+            "\020\005B\t\n\007request\"\364\002\n\rMongoResponse\022+\n\006statu" +
+            "s\030\001 \001(\0162\033.mongo.MongoResponse.Status\022)\n\007" +
+            "cleanup\030\002 \001(\0132\026.mongo.CleanupResponseH\000\022" +
+            "\'\n\006delete\030\003 \001(\0132\025.mongo.DeleteResponseH\000" +
+            "\022\'\n\006insert\030\004 \001(\0132\025.mongo.InsertResponseH" +
+            "\000\022#\n\004read\030\005 \001(\0132\023.mongo.ReadResponseH\000\022#" +
+            "\n\004scan\030\006 \001(\0132\023.mongo.ScanResponseH\000\022\'\n\006u" +
+            "pdate\030\007 \001(\0132\025.mongo.UpdateResponseH\000\":\n\006" +
+            "Status\022\006\n\002OK\020\000\022\t\n\005ERROR\020\001\022\r\n\tNOT_FOUND\020\002" +
+            "\022\016\n\nBATCHED_OK\020\003B\n\n\010response\"\020\n\016CleanupR" +
+            "equest\"\021\n\017CleanupResponse\"/\n\rDeleteReque" +
+            "st\022\022\n\ncollection\030\001 \001(\t\022\n\n\002id\030\002 \001(\t\"\020\n\016De" +
+            "leteResponse\"K\n\rInsertRequest\022\022\n\ncollect" +
+            "ion\030\001 \001(\t\022&\n\tdocuments\030\002 \003(\0132\023.mongo.BSO" +
+            "NDocument\"\034\n\014BSONDocument\022\014\n\004data\030\001 \001(\014\"" +
+            "\020\n\016InsertResponse\"=\n\013ReadRequest\022\022\n\ncoll" +
+            "ection\030\001 \001(\t\022\n\n\002id\030\002 \001(\t\022\016\n\006fields\030\003 \003(\t" +
+            "\"5\n\014ReadResponse\022%\n\010document\030\001 \001(\0132\023.mon" +
+            "go.BSONDocument\"X\n\013ScanRequest\022\022\n\ncollec" +
+            "tion\030\001 \001(\t\022\020\n\010startkey\030\002 \001(\t\022\023\n\013recordco" +
+            "unt\030\003 \001(\005\022\016\n\006fields\030\004 \003(\t\"6\n\014ScanRespons" +
+            "e\022&\n\tdocuments\030\001 \003(\0132\023.mongo.BSONDocumen" +
+            "t\"\\\n\rUpdateRequest\022\022\n\ncollection\030\001 \001(\t\022\n" +
+            "\n\002id\030\002 \001(\t\022+\n\016updateDocument\030\003 \001(\0132\023.mon" +
+            "go.BSONDocument\"\020\n\016UpdateResponseB\004Z\002./b" +
+            "\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+        .internalBuildGeneratedFileFrom(descriptorData,
+            new com.google.protobuf.Descriptors.FileDescriptor[] {
+            });
+    internal_static_mongo_MongoRequest_descriptor = getDescriptor().getMessageTypes().get(0);
+    internal_static_mongo_MongoRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_MongoRequest_descriptor,
+        new java.lang.String[] { "Type", "Cleanup", "Delete", "Insert", "Read", "Scan", "Update", "Request", });
+    internal_static_mongo_MongoResponse_descriptor = getDescriptor().getMessageTypes().get(1);
+    internal_static_mongo_MongoResponse_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_MongoResponse_descriptor,
+        new java.lang.String[] { "Status", "Cleanup", "Delete", "Insert", "Read", "Scan", "Update", "Response", });
+    internal_static_mongo_CleanupRequest_descriptor = getDescriptor().getMessageTypes().get(2);
+    internal_static_mongo_CleanupRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_CleanupRequest_descriptor,
+        new java.lang.String[] {});
+    internal_static_mongo_CleanupResponse_descriptor = getDescriptor().getMessageTypes().get(3);
+    internal_static_mongo_CleanupResponse_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_CleanupResponse_descriptor,
+        new java.lang.String[] {});
+    internal_static_mongo_DeleteRequest_descriptor = getDescriptor().getMessageTypes().get(4);
+    internal_static_mongo_DeleteRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_DeleteRequest_descriptor,
+        new java.lang.String[] { "Collection", "Id", });
+    internal_static_mongo_DeleteResponse_descriptor = getDescriptor().getMessageTypes().get(5);
+    internal_static_mongo_DeleteResponse_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_DeleteResponse_descriptor,
+        new java.lang.String[] {});
+    internal_static_mongo_InsertRequest_descriptor = getDescriptor().getMessageTypes().get(6);
+    internal_static_mongo_InsertRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_InsertRequest_descriptor,
+        new java.lang.String[] { "Collection", "Documents", });
+    internal_static_mongo_BSONDocument_descriptor = getDescriptor().getMessageTypes().get(7);
+    internal_static_mongo_BSONDocument_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_BSONDocument_descriptor,
+        new java.lang.String[] { "Data", });
+    internal_static_mongo_InsertResponse_descriptor = getDescriptor().getMessageTypes().get(8);
+    internal_static_mongo_InsertResponse_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_InsertResponse_descriptor,
+        new java.lang.String[] {});
+    internal_static_mongo_ReadRequest_descriptor = getDescriptor().getMessageTypes().get(9);
+    internal_static_mongo_ReadRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_ReadRequest_descriptor,
+        new java.lang.String[] { "Collection", "Id", "Fields", });
+    internal_static_mongo_ReadResponse_descriptor = getDescriptor().getMessageTypes().get(10);
+    internal_static_mongo_ReadResponse_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_ReadResponse_descriptor,
+        new java.lang.String[] { "Document", });
+    internal_static_mongo_ScanRequest_descriptor = getDescriptor().getMessageTypes().get(11);
+    internal_static_mongo_ScanRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_ScanRequest_descriptor,
+        new java.lang.String[] { "Collection", "Startkey", "Recordcount", "Fields", });
+    internal_static_mongo_ScanResponse_descriptor = getDescriptor().getMessageTypes().get(12);
+    internal_static_mongo_ScanResponse_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_ScanResponse_descriptor,
+        new java.lang.String[] { "Documents", });
+    internal_static_mongo_UpdateRequest_descriptor = getDescriptor().getMessageTypes().get(13);
+    internal_static_mongo_UpdateRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_UpdateRequest_descriptor,
+        new java.lang.String[] { "Collection", "Id", "UpdateDocument", });
+    internal_static_mongo_UpdateResponse_descriptor = getDescriptor().getMessageTypes().get(14);
+    internal_static_mongo_UpdateResponse_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_mongo_UpdateResponse_descriptor,
+        new java.lang.String[] {});
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/mongodb/src/main/java/site/ycsb/db/BsonToBytes.java b/mongodb/src/main/java/site/ycsb/db/BsonToBytes.java
new file mode 100644
index 0000000000..8fbbbaf8f3
--- /dev/null
+++ b/mongodb/src/main/java/site/ycsb/db/BsonToBytes.java
@@ -0,0 +1,31 @@
+package site.ycsb.db;
+
+import java.nio.ByteBuffer;
+
+import org.bson.BsonBinaryReader;
+import org.bson.BsonBinaryWriter;
+import org.bson.Document;
+import org.bson.codecs.Codec;
+import org.bson.codecs.DecoderContext;
+import org.bson.codecs.DocumentCodec;
+import org.bson.codecs.EncoderContext;
+import org.bson.io.BasicOutputBuffer;
+
+public class BsonToBytes {
+
+    private static final Codec DOCUMENT_CODEC = new DocumentCodec();
+
+    public static byte[] toBytes(Document document) {
+        BasicOutputBuffer buffer = new BasicOutputBuffer();
+        BsonBinaryWriter writer = new BsonBinaryWriter(buffer);
+        DOCUMENT_CODEC.encode(writer, document, EncoderContext.builder().isEncodingCollectibleDocument(true).build());
+        return buffer.toByteArray();
+    }
+
+    public static Document toDocument(byte[] bytes) {
+        BsonBinaryReader reader = new BsonBinaryReader(ByteBuffer.wrap(bytes));
+        Document document = DOCUMENT_CODEC.decode(reader, DecoderContext.builder().build());
+        reader.close();
+        return document;
+    }
+}
diff --git a/mongodb/src/main/java/site/ycsb/db/MongoDbModubftClient.java b/mongodb/src/main/java/site/ycsb/db/MongoDbModubftClient.java
new file mode 100644
index 0000000000..791058b32c
--- /dev/null
+++ b/mongodb/src/main/java/site/ycsb/db/MongoDbModubftClient.java
@@ -0,0 +1,332 @@
+package site.ycsb.db;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Vector;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.google.protobuf.ByteString;
+import org.bson.Document;
+
+import mongo.Mongo.*;
+import mongo.Mongo.MongoRequest.RequestType;
+import site.ycsb.ByteIterator;
+import site.ycsb.DB;
+import site.ycsb.DBException;
+import site.ycsb.Status;
+
+public class MongoDbModubftClient extends DB {
+    private int moduBftClientPort = 10000;
+
+    private Socket activeConnection;
+
+    private OutputStream out;
+    private InputStream in;
+
+    private int tId;
+
+    private static int batchSize;
+
+    private static final AtomicInteger INIT_COUNT = new AtomicInteger(0);
+
+    /** The bulk inserts pending for the thread. */
+    private final List bulkInserts = new ArrayList();
+
+    public void init() throws DBException {
+        try {
+            INIT_COUNT.incrementAndGet();
+            Properties props = getProperties();
+            batchSize = Integer.parseInt(props.getProperty("batchsize", "1"));
+            tId = Integer.parseInt(props.getProperty("threadId"));
+            moduBftClientPort += tId;
+            activeConnection = new Socket("localhost", moduBftClientPort);
+            out = activeConnection.getOutputStream();
+            in = activeConnection.getInputStream();
+        } catch (Exception e) {
+            throw new DBException(
+                    String.format("Failed to establish  connection with modubft client at port %d", moduBftClientPort),
+                    e);
+        }
+    }
+
+    /**
+     * Delete a record from the database.
+     * 
+     * @param table
+     *              The name of the table
+     * @param key
+     *              The record key of the record to delete.
+     * @return Zero on success, a non-zero error code on error. See the {@link DB}
+     *         class's description for a discussion of error codes.
+     */
+    @Override
+    public Status delete(String table, String key) {
+
+        DeleteRequest.Builder deleteRequestBuilder = DeleteRequest.newBuilder();
+        deleteRequestBuilder.setCollection(table);
+        deleteRequestBuilder.setId(key);
+        DeleteRequest deleteRequest = deleteRequestBuilder.build();
+
+        MongoRequest.Builder requestBuilder = MongoRequest.newBuilder();
+        requestBuilder.setType(RequestType.DELETE);
+        requestBuilder.setDelete(deleteRequest);
+        MongoRequest request = requestBuilder.build();
+
+        MongoResponse response = sendRequest(request);
+
+        if (response.getStatus().equals(mongo.Mongo.MongoResponse.Status.OK)) {
+            return Status.OK;
+        }
+
+        return Status.ERROR;
+    }
+
+    /**
+     * Insert a record in the database. Any field/value pairs in the specified
+     * values HashMap will be written into the record with the specified record
+     * key.
+     * 
+     * @param table
+     *               The name of the table
+     * @param key
+     *               The record key of the record to insert.
+     * @param values
+     *               A HashMap of field/value pairs to insert in the record
+     * @return Zero on success, a non-zero error code on error. See the {@link DB}
+     *         class's description for a discussion of error codes.
+     */
+    @Override
+    public Status insert(String table, String key,
+            Map values) {
+        Document toInsert = new Document("_id", key);
+        for (Map.Entry entry : values.entrySet()) {
+            toInsert.put(entry.getKey(), entry.getValue().toArray());
+        }
+        InsertRequest insertRequest;
+        if (batchSize == 1) {
+            List bsonDocuments = convertDocuments2BSONs(Arrays.asList(toInsert));
+            insertRequest = InsertRequest.newBuilder().setCollection(table)
+                    .addAllDocuments(bsonDocuments).build();
+        } else {
+            bulkInserts.add(toInsert);
+            if (bulkInserts.size() == batchSize) {
+                List bsonDocuments = convertDocuments2BSONs(bulkInserts);
+                insertRequest = InsertRequest.newBuilder().setCollection(table)
+                        .addAllDocuments(bsonDocuments).build();
+            } else {
+                return Status.BATCHED_OK;
+            }
+        }
+
+        MongoRequest request = MongoRequest.newBuilder().setType(RequestType.INSERT).setInsert(insertRequest).build();
+        MongoResponse response = sendRequest(request);
+        if (response.getStatus().equals(mongo.Mongo.MongoResponse.Status.OK)) {
+            return Status.OK;
+        }
+
+        return Status.ERROR;
+    }
+
+    /**
+     * Read a record from the database. Each field/value pair from the result will
+     * be stored in a HashMap.
+     * 
+     * @param table
+     *               The name of the table
+     * @param key
+     *               The record key of the record to read.
+     * @param fields
+     *               The list of fields to read, or null for all of them
+     * @param result
+     *               A HashMap of field/value pairs for the result
+     * @return Zero on success, a non-zero error code on error or "not found".
+     */
+    @Override
+    public Status read(String table, String key, Set fields,
+            Map result) {
+        // build read request
+        ReadRequest.Builder readRequesBuilder = ReadRequest.newBuilder();
+        readRequesBuilder.setCollection(table);
+        if (fields != null) {
+            readRequesBuilder.addAllFields(fields);
+        }
+        readRequesBuilder.setId(key);
+        ReadRequest readRequest = readRequesBuilder.build();
+
+        // build mongo request
+        MongoRequest.Builder requestBuilder = MongoRequest.newBuilder();
+        requestBuilder.setRead(readRequest).setType(RequestType.READ);
+        MongoRequest request = requestBuilder.build();
+
+        MongoResponse response = sendRequest(request);
+
+        if (response.getStatus().equals(MongoResponse.Status.OK) && response.getRead().hasDocument()) {
+            return Status.OK;
+        }
+        return Status.ERROR;
+    }
+
+    /**
+     * Perform a range scan for a set of records in the database. Each field/value
+     * pair from the result will be stored in a HashMap.
+     * 
+     * @param table
+     *                    The name of the table
+     * @param startkey
+     *                    The record key of the first record to read.
+     * @param recordcount
+     *                    The number of records to read
+     * @param fields
+     *                    The list of fields to read, or null for all of them
+     * @param result
+     *                    A Vector of HashMaps, where each HashMap is a set
+     *                    field/value
+     *                    pairs for one record
+     * @return Zero on success, a non-zero error code on error. See the {@link DB}
+     *         class's description for a discussion of error codes.
+     */
+    @Override
+    public Status scan(String table, String startkey, int recordcount,
+            Set fields, Vector> result) {
+        ScanRequest.Builder scanRequestBuilder = ScanRequest.newBuilder().setCollection(table).setStartkey(startkey);
+        if (fields != null) {
+            scanRequestBuilder.addAllFields(fields);
+        }
+        ScanRequest scanRequest = scanRequestBuilder.build();
+        MongoRequest request = MongoRequest.newBuilder().setScan(scanRequest).build();
+        MongoResponse response = sendRequest(request);
+        if (response.getStatus().equals(MongoResponse.Status.OK)
+                && response.getScan().getDocumentsList().size() == recordcount) {
+            return Status.OK;
+        }
+        return Status.ERROR;
+    }
+
+    /**
+     * Update a record in the database. Any field/value pairs in the specified
+     * values HashMap will be written into the record with the specified record
+     * key, overwriting any existing values with the same field name.
+     * 
+     * @param table
+     *               The name of the table
+     * @param key
+     *               The record key of the record to write.
+     * @param values
+     *               A HashMap of field/value pairs to update in the record
+     * @return Zero on success, a non-zero error code on error. See this class's
+     *         description for a discussion of error codes.
+     */
+    @Override
+    public Status update(String table, String key,
+            Map values) {
+        Document fieldsToSet = new Document();
+        for (Map.Entry entry : values.entrySet()) {
+            fieldsToSet.put(entry.getKey(), entry.getValue().toArray());
+        }
+        Document update = new Document("$set", fieldsToSet);
+        BSONDocument updateBSON = convertDocument2BSON(update);
+        UpdateRequest updateRequest = UpdateRequest.newBuilder().setCollection(table).setId(key)
+                .setUpdateDocument(updateBSON).build();
+        MongoRequest request = MongoRequest.newBuilder().setUpdate(updateRequest).setType(RequestType.UPDATE).build();
+        MongoResponse response = sendRequest(request);
+        if (response.getStatus().equals(MongoResponse.Status.OK)) {
+            return Status.OK;
+        }
+        return Status.ERROR;
+    }
+
+    /**
+     * Cleanup any state for this DB. Called once per DB instance; there is one DB
+     * instance per client thread.
+     */
+    @Override
+    public void cleanup() throws DBException {
+        if (INIT_COUNT.decrementAndGet() == 0) {
+            CleanupRequest cleanupRequest = CleanupRequest.newBuilder().build();
+            MongoRequest request = MongoRequest.newBuilder().setType(RequestType.CLEANUP).setCleanup(cleanupRequest)
+                    .build();
+            MongoResponse response = sendRequest(request);
+            if (!response.getStatus().equals(MongoResponse.Status.OK)) {
+                throw new DBException("Cleanup unsuccessful");
+            }
+        }
+
+    }
+
+    private List convertDocuments2BSONs(List documents) {
+        List bsonDocuments = new ArrayList<>();
+        for (Document document : documents) {
+            BSONDocument bsonDocument = convertDocument2BSON(document);
+            bsonDocuments.add(bsonDocument);
+        }
+        return bsonDocuments;
+    }
+
+    private BSONDocument convertDocument2BSON(Document document) {
+        byte[] documentBytes = BsonToBytes.toBytes(document);
+        ByteString documentByteString = ByteString.copyFrom(documentBytes);
+        return BSONDocument.newBuilder().setData(documentByteString).build();
+    }
+
+    private MongoResponse sendRequest(MongoRequest request) {
+        try {
+            byte[] requestBytes = request.toByteArray();
+            byte[] length = ByteBuffer.allocate(4).putInt(requestBytes.length).array();
+            out.write(length);
+            out.write(requestBytes);
+            out.flush();
+            return getResponse();
+        } catch (Exception e) {
+            e.printStackTrace();
+            MongoResponse.Builder badResponseBuilder = MongoResponse.newBuilder();
+            badResponseBuilder.setStatus(mongo.Mongo.MongoResponse.Status.ERROR);
+            return badResponseBuilder.build();
+        }
+    }
+
+    private MongoResponse getResponse() throws IOException {
+        byte[] lengthBuf = new byte[4];
+        int bytesRead = 0;
+
+        while (bytesRead < 4) {
+            int result = in.read(lengthBuf, bytesRead, 4 - bytesRead);
+            if (result == -1) {
+                if (bytesRead == 0) {
+                    return null; // end of stream
+                } else {
+                    throw new IOException("Unexpected end of stream");
+                }
+            }
+            bytesRead += result;
+        }
+        int length = ByteBuffer.wrap(lengthBuf).getInt();
+        if (length == 0) {
+            throw new IOException("response size can't be 0");
+        }
+        byte[] messageBytes = new byte[length];
+
+        bytesRead = 0;
+
+        while (bytesRead < length) {
+            int result = in.read(messageBytes, bytesRead, length);
+            if (result == -1) {
+                throw new IOException("Unexpected end of stream");
+            }
+            bytesRead += result;
+        }
+        MongoResponse response = MongoResponse.parseFrom(messageBytes);
+
+        return response;
+    }
+
+}
diff --git a/proto/mongo.proto b/proto/mongo.proto
new file mode 100644
index 0000000000..6ebb882493
--- /dev/null
+++ b/proto/mongo.proto
@@ -0,0 +1,93 @@
+syntax = "proto3";
+
+package mongo;
+
+option go_package = "./";
+
+message MongoRequest {
+  enum RequestType {
+    CLEANUP = 0;
+    DELETE = 1;
+    INSERT = 2;
+    READ = 3;
+    SCAN = 4;
+    UPDATE = 5;
+  }
+
+  RequestType type = 1;
+
+  oneof request {
+    CleanupRequest cleanup = 2;
+    DeleteRequest delete = 3;
+    InsertRequest insert = 4;
+    ReadRequest read = 5;
+    ScanRequest scan = 6;
+    UpdateRequest update = 7;
+  }
+}
+
+message MongoResponse {
+  enum Status {
+    OK = 0;
+    ERROR = 1;
+    NOT_FOUND = 2;
+    BATCHED_OK = 3;
+  }
+
+  Status status = 1;
+
+  oneof response {
+    CleanupResponse cleanup = 2;
+    DeleteResponse delete = 3;
+    InsertResponse insert = 4;
+    ReadResponse read = 5;
+    ScanResponse scan = 6;
+    UpdateResponse update = 7;
+  }
+}
+
+message CleanupRequest {}
+message CleanupResponse {}
+
+message DeleteRequest {
+  string collection = 1;
+  string id = 2;
+}
+message DeleteResponse {}
+
+message InsertRequest {
+  string collection = 1;
+  repeated BSONDocument documents = 2;
+}
+
+message BSONDocument {
+  bytes data = 1;
+}
+message InsertResponse {}
+
+message ReadRequest {
+  string collection = 1;
+  string id = 2;
+  repeated string fields = 3;
+}
+message ReadResponse {
+  BSONDocument document = 1;
+}
+
+message ScanRequest {
+  string collection = 1;
+  string startkey = 2;
+  int32 recordcount = 3;
+  repeated string fields = 4;
+}
+message ScanResponse {
+  repeated BSONDocument documents = 1;
+}
+
+
+message UpdateRequest {
+  string collection = 1;
+  string id = 2;
+ BSONDocument updateDocument = 3;
+}
+message UpdateResponse {}
\ No newline at end of file
diff --git a/proto/response.proto b/proto/response.proto
new file mode 100644
index 0000000000..1739cb159e
--- /dev/null
+++ b/proto/response.proto
@@ -0,0 +1,6 @@
+syntax = "proto3";
+package responseMessage;
+option go_package = "./responseMessage";
+message Response {
+ repeated string result = 1;
+}
\ No newline at end of file
diff --git a/redis/pom.xml b/redis/pom.xml
index f808bec031..8fff912489 100644
--- a/redis/pom.xml
+++ b/redis/pom.xml
@@ -41,5 +41,10 @@ LICENSE file.
       ${project.version}
       provided
     
+    
+    com.google.protobuf
+    protobuf-java
+    3.19.6
+
   
 
diff --git a/redis/src/main/java/queryMessage/Message.java b/redis/src/main/java/queryMessage/Message.java
new file mode 100644
index 0000000000..9f75288e91
--- /dev/null
+++ b/redis/src/main/java/queryMessage/Message.java
@@ -0,0 +1,715 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: message.proto
+
+package queryMessage;
+
+public final class Message {
+    private Message() {
+    }
+
+    public static void registerAllExtensions(
+            com.google.protobuf.ExtensionRegistryLite registry) {
+    }
+
+    public static void registerAllExtensions(
+            com.google.protobuf.ExtensionRegistry registry) {
+        registerAllExtensions(
+                (com.google.protobuf.ExtensionRegistryLite) registry);
+    }
+
+    public interface QueryOrBuilder extends
+            // @@protoc_insertion_point(interface_extends:queryMessage.Query)
+            com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * repeated string values = 1;
+         * 
+         * @return A list containing the values.
+         */
+        java.util.List getValuesList();
+
+        /**
+         * repeated string values = 1;
+         * 
+         * @return The count of values.
+         */
+        int getValuesCount();
+
+        /**
+         * repeated string values = 1;
+         * 
+         * @param index The index of the element to return.
+         * @return The values at the given index.
+         */
+        java.lang.String getValues(int index);
+
+        /**
+         * repeated string values = 1;
+         * 
+         * @param index The index of the value to return.
+         * @return The bytes of the values at the given index.
+         */
+        com.google.protobuf.ByteString getValuesBytes(int index);
+    }
+
+    /**
+     * Protobuf type {@code queryMessage.Query}
+     */
+    public static final class Query extends
+            com.google.protobuf.GeneratedMessageV3 implements
+            // @@protoc_insertion_point(message_implements:queryMessage.Query)
+            QueryOrBuilder {
+        private static final long serialVersionUID = 0L;
+
+        // Use Query.newBuilder() to construct.
+        private Query(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+            super(builder);
+        }
+
+        private Query() {
+            values_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(
+                UnusedPrivateParameter unused) {
+            return new Query();
+        }
+
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return queryMessage.Message.internal_static_queryMessage_Query_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return queryMessage.Message.internal_static_queryMessage_Query_fieldAccessorTable
+                    .ensureFieldAccessorsInitialized(
+                            queryMessage.Message.Query.class, queryMessage.Message.Query.Builder.class);
+        }
+
+        public static final int VALUES_FIELD_NUMBER = 1;
+        private com.google.protobuf.LazyStringList values_;
+
+        /**
+         * repeated string values = 1;
+         * 
+         * @return A list containing the values.
+         */
+        public com.google.protobuf.ProtocolStringList getValuesList() {
+            return values_;
+        }
+
+        /**
+         * repeated string values = 1;
+         * 
+         * @return The count of values.
+         */
+        public int getValuesCount() {
+            return values_.size();
+        }
+
+        /**
+         * repeated string values = 1;
+         * 
+         * @param index The index of the element to return.
+         * @return The values at the given index.
+         */
+        public java.lang.String getValues(int index) {
+            return values_.get(index);
+        }
+
+        /**
+         * repeated string values = 1;
+         * 
+         * @param index The index of the value to return.
+         * @return The bytes of the values at the given index.
+         */
+        public com.google.protobuf.ByteString getValuesBytes(int index) {
+            return values_.getByteString(index);
+        }
+
+        private byte memoizedIsInitialized = -1;
+
+        @java.lang.Override
+        public final boolean isInitialized() {
+            byte isInitialized = memoizedIsInitialized;
+            if (isInitialized == 1)
+                return true;
+            if (isInitialized == 0)
+                return false;
+
+            memoizedIsInitialized = 1;
+            return true;
+        }
+
+        @java.lang.Override
+        public void writeTo(com.google.protobuf.CodedOutputStream output)
+                throws java.io.IOException {
+            for (int i = 0; i < values_.size(); i++) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 1, values_.getRaw(i));
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+
+            size = 0;
+            {
+                int dataSize = 0;
+                for (int i = 0; i < values_.size(); i++) {
+                    dataSize += computeStringSizeNoTag(values_.getRaw(i));
+                }
+                size += dataSize;
+                size += 1 * getValuesList().size();
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSize = size;
+            return size;
+        }
+
+        @java.lang.Override
+        public boolean equals(final java.lang.Object obj) {
+            if (obj == this) {
+                return true;
+            }
+            if (!(obj instanceof queryMessage.Message.Query)) {
+                return super.equals(obj);
+            }
+            queryMessage.Message.Query other = (queryMessage.Message.Query) obj;
+
+            if (!getValuesList()
+                    .equals(other.getValuesList()))
+                return false;
+            if (!getUnknownFields().equals(other.getUnknownFields()))
+                return false;
+            return true;
+        }
+
+        @java.lang.Override
+        public int hashCode() {
+            if (memoizedHashCode != 0) {
+                return memoizedHashCode;
+            }
+            int hash = 41;
+            hash = (19 * hash) + getDescriptor().hashCode();
+            if (getValuesCount() > 0) {
+                hash = (37 * hash) + VALUES_FIELD_NUMBER;
+                hash = (53 * hash) + getValuesList().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static queryMessage.Message.Query parseFrom(
+                java.nio.ByteBuffer data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static queryMessage.Message.Query parseFrom(
+                java.nio.ByteBuffer data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static queryMessage.Message.Query parseFrom(
+                com.google.protobuf.ByteString data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static queryMessage.Message.Query parseFrom(
+                com.google.protobuf.ByteString data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static queryMessage.Message.Query parseFrom(byte[] data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static queryMessage.Message.Query parseFrom(
+                byte[] data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static queryMessage.Message.Query parseFrom(java.io.InputStream input)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseWithIOException(PARSER, input);
+        }
+
+        public static queryMessage.Message.Query parseFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseWithIOException(PARSER, input, extensionRegistry);
+        }
+
+        public static queryMessage.Message.Query parseDelimitedFrom(java.io.InputStream input)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static queryMessage.Message.Query parseDelimitedFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+        }
+
+        public static queryMessage.Message.Query parseFrom(
+                com.google.protobuf.CodedInputStream input)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseWithIOException(PARSER, input);
+        }
+
+        public static queryMessage.Message.Query parseFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseWithIOException(PARSER, input, extensionRegistry);
+        }
+
+        @java.lang.Override
+        public Builder newBuilderForType() {
+            return newBuilder();
+        }
+
+        public static Builder newBuilder() {
+            return DEFAULT_INSTANCE.toBuilder();
+        }
+
+        public static Builder newBuilder(queryMessage.Message.Query prototype) {
+            return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+        }
+
+        @java.lang.Override
+        public Builder toBuilder() {
+            return this == DEFAULT_INSTANCE
+                    ? new Builder()
+                    : new Builder().mergeFrom(this);
+        }
+
+        @java.lang.Override
+        protected Builder newBuilderForType(
+                com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+            Builder builder = new Builder(parent);
+            return builder;
+        }
+
+        /**
+         * Protobuf type {@code queryMessage.Query}
+         */
+        public static final class Builder extends
+                com.google.protobuf.GeneratedMessageV3.Builder implements
+                // @@protoc_insertion_point(builder_implements:queryMessage.Query)
+                queryMessage.Message.QueryOrBuilder {
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return queryMessage.Message.internal_static_queryMessage_Query_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return queryMessage.Message.internal_static_queryMessage_Query_fieldAccessorTable
+                        .ensureFieldAccessorsInitialized(
+                                queryMessage.Message.Query.class, queryMessage.Message.Query.Builder.class);
+            }
+
+            // Construct using queryMessage.Message.Query.newBuilder()
+            private Builder() {
+
+            }
+
+            private Builder(
+                    com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                values_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+                bitField0_ = (bitField0_ & ~0x00000001);
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return queryMessage.Message.internal_static_queryMessage_Query_descriptor;
+            }
+
+            @java.lang.Override
+            public queryMessage.Message.Query getDefaultInstanceForType() {
+                return queryMessage.Message.Query.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public queryMessage.Message.Query build() {
+                queryMessage.Message.Query result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public queryMessage.Message.Query buildPartial() {
+                queryMessage.Message.Query result = new queryMessage.Message.Query(this);
+                int from_bitField0_ = bitField0_;
+                if (((bitField0_ & 0x00000001) != 0)) {
+                    values_ = values_.getUnmodifiableView();
+                    bitField0_ = (bitField0_ & ~0x00000001);
+                }
+                result.values_ = values_;
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(
+                    com.google.protobuf.Descriptors.FieldDescriptor field,
+                    java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(
+                    com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(
+                    com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(
+                    com.google.protobuf.Descriptors.FieldDescriptor field,
+                    int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(
+                    com.google.protobuf.Descriptors.FieldDescriptor field,
+                    java.lang.Object value) {
+                return super.addRepeatedField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof queryMessage.Message.Query) {
+                    return mergeFrom((queryMessage.Message.Query) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(queryMessage.Message.Query other) {
+                if (other == queryMessage.Message.Query.getDefaultInstance())
+                    return this;
+                if (!other.values_.isEmpty()) {
+                    if (values_.isEmpty()) {
+                        values_ = other.values_;
+                        bitField0_ = (bitField0_ & ~0x00000001);
+                    } else {
+                        ensureValuesIsMutable();
+                        values_.addAll(other.values_);
+                    }
+                    onChanged();
+                }
+                this.mergeUnknownFields(other.getUnknownFields());
+                onChanged();
+                return this;
+            }
+
+            @java.lang.Override
+            public final boolean isInitialized() {
+                return true;
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(
+                    com.google.protobuf.CodedInputStream input,
+                    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                    throws java.io.IOException {
+                if (extensionRegistry == null) {
+                    throw new java.lang.NullPointerException();
+                }
+                try {
+                    boolean done = false;
+                    while (!done) {
+                        int tag = input.readTag();
+                        switch (tag) {
+                            case 0:
+                                done = true;
+                                break;
+                            case 10: {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                ensureValuesIsMutable();
+                                values_.add(s);
+                                break;
+                            } // case 10
+                            default: {
+                                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                                    done = true; // was an endgroup tag
+                                }
+                                break;
+                            } // default:
+                        } // switch (tag)
+                    } // while (!done)
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.unwrapIOException();
+                } finally {
+                    onChanged();
+                } // finally
+                return this;
+            }
+
+            private int bitField0_;
+
+            private com.google.protobuf.LazyStringList values_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+
+            private void ensureValuesIsMutable() {
+                if (!((bitField0_ & 0x00000001) != 0)) {
+                    values_ = new com.google.protobuf.LazyStringArrayList(values_);
+                    bitField0_ |= 0x00000001;
+                }
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @return A list containing the values.
+             */
+            public com.google.protobuf.ProtocolStringList getValuesList() {
+                return values_.getUnmodifiableView();
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @return The count of values.
+             */
+            public int getValuesCount() {
+                return values_.size();
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @param index The index of the element to return.
+             * @return The values at the given index.
+             */
+            public java.lang.String getValues(int index) {
+                return values_.get(index);
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @param index The index of the value to return.
+             * @return The bytes of the values at the given index.
+             */
+            public com.google.protobuf.ByteString getValuesBytes(int index) {
+                return values_.getByteString(index);
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @param index The index to set the value at.
+             * @param value The values to set.
+             * @return This builder for chaining.
+             */
+            public Builder setValues(
+                    int index, java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ensureValuesIsMutable();
+                values_.set(index, value);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @param value The values to add.
+             * @return This builder for chaining.
+             */
+            public Builder addValues(
+                    java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ensureValuesIsMutable();
+                values_.add(value);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @param values The values to add.
+             * @return This builder for chaining.
+             */
+            public Builder addAllValues(
+                    java.lang.Iterable values) {
+                ensureValuesIsMutable();
+                com.google.protobuf.AbstractMessageLite.Builder.addAll(
+                        values, values_);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @return This builder for chaining.
+             */
+            public Builder clearValues() {
+                values_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+                bitField0_ = (bitField0_ & ~0x00000001);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string values = 1;
+             * 
+             * @param value The bytes of the values to add.
+             * @return This builder for chaining.
+             */
+            public Builder addValuesBytes(
+                    com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                ensureValuesIsMutable();
+                values_.add(value);
+                onChanged();
+                return this;
+            }
+
+            @java.lang.Override
+            public final Builder setUnknownFields(
+                    final com.google.protobuf.UnknownFieldSet unknownFields) {
+                return super.setUnknownFields(unknownFields);
+            }
+
+            @java.lang.Override
+            public final Builder mergeUnknownFields(
+                    final com.google.protobuf.UnknownFieldSet unknownFields) {
+                return super.mergeUnknownFields(unknownFields);
+            }
+
+            // @@protoc_insertion_point(builder_scope:queryMessage.Query)
+        }
+
+        // @@protoc_insertion_point(class_scope:queryMessage.Query)
+        private static final queryMessage.Message.Query DEFAULT_INSTANCE;
+        static {
+            DEFAULT_INSTANCE = new queryMessage.Message.Query();
+        }
+
+        public static queryMessage.Message.Query getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+            @java.lang.Override
+            public Query parsePartialFrom(
+                    com.google.protobuf.CodedInputStream input,
+                    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                    throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+                } catch (java.io.IOException e) {
+                    throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                            .setUnfinishedMessage(builder.buildPartial());
+                }
+                return builder.buildPartial();
+            }
+        };
+
+        public static com.google.protobuf.Parser parser() {
+            return PARSER;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Parser getParserForType() {
+            return PARSER;
+        }
+
+        @java.lang.Override
+        public queryMessage.Message.Query getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+
+    }
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_queryMessage_Query_descriptor;
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_queryMessage_Query_fieldAccessorTable;
+
+    public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
+        return descriptor;
+    }
+
+    private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
+    static {
+        java.lang.String[] descriptorData = {
+                "\n\rmessage.proto\022\014queryMessage\"\027\n\005Query\022\016" +
+                        "\n\006values\030\001 \003(\tb\006proto3"
+        };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor
+                .internalBuildGeneratedFileFrom(descriptorData,
+                        new com.google.protobuf.Descriptors.FileDescriptor[] {
+                        });
+        internal_static_queryMessage_Query_descriptor = getDescriptor().getMessageTypes().get(0);
+        internal_static_queryMessage_Query_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+                internal_static_queryMessage_Query_descriptor,
+                new java.lang.String[] { "Values", });
+    }
+
+    // @@protoc_insertion_point(outer_class_scope)
+}
\ No newline at end of file
diff --git a/redis/src/main/java/responseMessage/ResponseOuterClass.java b/redis/src/main/java/responseMessage/ResponseOuterClass.java
new file mode 100644
index 0000000000..aadc40bda4
--- /dev/null
+++ b/redis/src/main/java/responseMessage/ResponseOuterClass.java
@@ -0,0 +1,719 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: response.proto
+
+package responseMessage;
+
+public final class ResponseOuterClass {
+    private ResponseOuterClass() {
+    }
+
+    public static void registerAllExtensions(
+            com.google.protobuf.ExtensionRegistryLite registry) {
+    }
+
+    public static void registerAllExtensions(
+            com.google.protobuf.ExtensionRegistry registry) {
+        registerAllExtensions(
+                (com.google.protobuf.ExtensionRegistryLite) registry);
+    }
+
+    public interface ResponseOrBuilder extends
+            // @@protoc_insertion_point(interface_extends:responseMessage.Response)
+            com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * repeated string result = 1;
+         * 
+         * @return A list containing the result.
+         */
+        java.util.List getResultList();
+
+        /**
+         * repeated string result = 1;
+         * 
+         * @return The count of result.
+         */
+        int getResultCount();
+
+        /**
+         * repeated string result = 1;
+         * 
+         * @param index The index of the element to return.
+         * @return The result at the given index.
+         */
+        java.lang.String getResult(int index);
+
+        /**
+         * repeated string result = 1;
+         * 
+         * @param index The index of the value to return.
+         * @return The bytes of the result at the given index.
+         */
+        com.google.protobuf.ByteString getResultBytes(int index);
+    }
+
+    /**
+     * Protobuf type {@code responseMessage.Response}
+     */
+    public static final class Response extends
+            com.google.protobuf.GeneratedMessageV3 implements
+            // @@protoc_insertion_point(message_implements:responseMessage.Response)
+            ResponseOrBuilder {
+        private static final long serialVersionUID = 0L;
+
+        // Use Response.newBuilder() to construct.
+        private Response(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+            super(builder);
+        }
+
+        private Response() {
+            result_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(
+                UnusedPrivateParameter unused) {
+            return new Response();
+        }
+
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return responseMessage.ResponseOuterClass.internal_static_responseMessage_Response_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return responseMessage.ResponseOuterClass.internal_static_responseMessage_Response_fieldAccessorTable
+                    .ensureFieldAccessorsInitialized(
+                            responseMessage.ResponseOuterClass.Response.class,
+                            responseMessage.ResponseOuterClass.Response.Builder.class);
+        }
+
+        public static final int RESULT_FIELD_NUMBER = 1;
+        private com.google.protobuf.LazyStringList result_;
+
+        /**
+         * repeated string result = 1;
+         * 
+         * @return A list containing the result.
+         */
+        public com.google.protobuf.ProtocolStringList getResultList() {
+            return result_;
+        }
+
+        /**
+         * repeated string result = 1;
+         * 
+         * @return The count of result.
+         */
+        public int getResultCount() {
+            return result_.size();
+        }
+
+        /**
+         * repeated string result = 1;
+         * 
+         * @param index The index of the element to return.
+         * @return The result at the given index.
+         */
+        public java.lang.String getResult(int index) {
+            return result_.get(index);
+        }
+
+        /**
+         * repeated string result = 1;
+         * 
+         * @param index The index of the value to return.
+         * @return The bytes of the result at the given index.
+         */
+        public com.google.protobuf.ByteString getResultBytes(int index) {
+            return result_.getByteString(index);
+        }
+
+        private byte memoizedIsInitialized = -1;
+
+        @java.lang.Override
+        public final boolean isInitialized() {
+            byte isInitialized = memoizedIsInitialized;
+            if (isInitialized == 1)
+                return true;
+            if (isInitialized == 0)
+                return false;
+
+            memoizedIsInitialized = 1;
+            return true;
+        }
+
+        @java.lang.Override
+        public void writeTo(com.google.protobuf.CodedOutputStream output)
+                throws java.io.IOException {
+            for (int i = 0; i < result_.size(); i++) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 1, result_.getRaw(i));
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+
+            size = 0;
+            {
+                int dataSize = 0;
+                for (int i = 0; i < result_.size(); i++) {
+                    dataSize += computeStringSizeNoTag(result_.getRaw(i));
+                }
+                size += dataSize;
+                size += 1 * getResultList().size();
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSize = size;
+            return size;
+        }
+
+        @java.lang.Override
+        public boolean equals(final java.lang.Object obj) {
+            if (obj == this) {
+                return true;
+            }
+            if (!(obj instanceof responseMessage.ResponseOuterClass.Response)) {
+                return super.equals(obj);
+            }
+            responseMessage.ResponseOuterClass.Response other = (responseMessage.ResponseOuterClass.Response) obj;
+
+            if (!getResultList()
+                    .equals(other.getResultList()))
+                return false;
+            if (!getUnknownFields().equals(other.getUnknownFields()))
+                return false;
+            return true;
+        }
+
+        @java.lang.Override
+        public int hashCode() {
+            if (memoizedHashCode != 0) {
+                return memoizedHashCode;
+            }
+            int hash = 41;
+            hash = (19 * hash) + getDescriptor().hashCode();
+            if (getResultCount() > 0) {
+                hash = (37 * hash) + RESULT_FIELD_NUMBER;
+                hash = (53 * hash) + getResultList().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(
+                java.nio.ByteBuffer data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(
+                java.nio.ByteBuffer data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(
+                com.google.protobuf.ByteString data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(
+                com.google.protobuf.ByteString data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(byte[] data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(
+                byte[] data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(java.io.InputStream input)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseWithIOException(PARSER, input);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseWithIOException(PARSER, input, extensionRegistry);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseDelimitedFrom(java.io.InputStream input)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseDelimitedFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(
+                com.google.protobuf.CodedInputStream input)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseWithIOException(PARSER, input);
+        }
+
+        public static responseMessage.ResponseOuterClass.Response parseFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3
+                    .parseWithIOException(PARSER, input, extensionRegistry);
+        }
+
+        @java.lang.Override
+        public Builder newBuilderForType() {
+            return newBuilder();
+        }
+
+        public static Builder newBuilder() {
+            return DEFAULT_INSTANCE.toBuilder();
+        }
+
+        public static Builder newBuilder(responseMessage.ResponseOuterClass.Response prototype) {
+            return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+        }
+
+        @java.lang.Override
+        public Builder toBuilder() {
+            return this == DEFAULT_INSTANCE
+                    ? new Builder()
+                    : new Builder().mergeFrom(this);
+        }
+
+        @java.lang.Override
+        protected Builder newBuilderForType(
+                com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+            Builder builder = new Builder(parent);
+            return builder;
+        }
+
+        /**
+         * Protobuf type {@code responseMessage.Response}
+         */
+        public static final class Builder extends
+                com.google.protobuf.GeneratedMessageV3.Builder implements
+                // @@protoc_insertion_point(builder_implements:responseMessage.Response)
+                responseMessage.ResponseOuterClass.ResponseOrBuilder {
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return responseMessage.ResponseOuterClass.internal_static_responseMessage_Response_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return responseMessage.ResponseOuterClass.internal_static_responseMessage_Response_fieldAccessorTable
+                        .ensureFieldAccessorsInitialized(
+                                responseMessage.ResponseOuterClass.Response.class,
+                                responseMessage.ResponseOuterClass.Response.Builder.class);
+            }
+
+            // Construct using responseMessage.ResponseOuterClass.Response.newBuilder()
+            private Builder() {
+
+            }
+
+            private Builder(
+                    com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                result_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+                bitField0_ = (bitField0_ & ~0x00000001);
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return responseMessage.ResponseOuterClass.internal_static_responseMessage_Response_descriptor;
+            }
+
+            @java.lang.Override
+            public responseMessage.ResponseOuterClass.Response getDefaultInstanceForType() {
+                return responseMessage.ResponseOuterClass.Response.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public responseMessage.ResponseOuterClass.Response build() {
+                responseMessage.ResponseOuterClass.Response result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public responseMessage.ResponseOuterClass.Response buildPartial() {
+                responseMessage.ResponseOuterClass.Response result = new responseMessage.ResponseOuterClass.Response(
+                        this);
+                int from_bitField0_ = bitField0_;
+                if (((bitField0_ & 0x00000001) != 0)) {
+                    result_ = result_.getUnmodifiableView();
+                    bitField0_ = (bitField0_ & ~0x00000001);
+                }
+                result.result_ = result_;
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(
+                    com.google.protobuf.Descriptors.FieldDescriptor field,
+                    java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(
+                    com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(
+                    com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(
+                    com.google.protobuf.Descriptors.FieldDescriptor field,
+                    int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(
+                    com.google.protobuf.Descriptors.FieldDescriptor field,
+                    java.lang.Object value) {
+                return super.addRepeatedField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof responseMessage.ResponseOuterClass.Response) {
+                    return mergeFrom((responseMessage.ResponseOuterClass.Response) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(responseMessage.ResponseOuterClass.Response other) {
+                if (other == responseMessage.ResponseOuterClass.Response.getDefaultInstance())
+                    return this;
+                if (!other.result_.isEmpty()) {
+                    if (result_.isEmpty()) {
+                        result_ = other.result_;
+                        bitField0_ = (bitField0_ & ~0x00000001);
+                    } else {
+                        ensureResultIsMutable();
+                        result_.addAll(other.result_);
+                    }
+                    onChanged();
+                }
+                this.mergeUnknownFields(other.getUnknownFields());
+                onChanged();
+                return this;
+            }
+
+            @java.lang.Override
+            public final boolean isInitialized() {
+                return true;
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(
+                    com.google.protobuf.CodedInputStream input,
+                    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                    throws java.io.IOException {
+                if (extensionRegistry == null) {
+                    throw new java.lang.NullPointerException();
+                }
+                try {
+                    boolean done = false;
+                    while (!done) {
+                        int tag = input.readTag();
+                        switch (tag) {
+                            case 0:
+                                done = true;
+                                break;
+                            case 10: {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                ensureResultIsMutable();
+                                result_.add(s);
+                                break;
+                            } // case 10
+                            default: {
+                                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                                    done = true; // was an endgroup tag
+                                }
+                                break;
+                            } // default:
+                        } // switch (tag)
+                    } // while (!done)
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.unwrapIOException();
+                } finally {
+                    onChanged();
+                } // finally
+                return this;
+            }
+
+            private int bitField0_;
+
+            private com.google.protobuf.LazyStringList result_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+
+            private void ensureResultIsMutable() {
+                if (!((bitField0_ & 0x00000001) != 0)) {
+                    result_ = new com.google.protobuf.LazyStringArrayList(result_);
+                    bitField0_ |= 0x00000001;
+                }
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @return A list containing the result.
+             */
+            public com.google.protobuf.ProtocolStringList getResultList() {
+                return result_.getUnmodifiableView();
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @return The count of result.
+             */
+            public int getResultCount() {
+                return result_.size();
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @param index The index of the element to return.
+             * @return The result at the given index.
+             */
+            public java.lang.String getResult(int index) {
+                return result_.get(index);
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @param index The index of the value to return.
+             * @return The bytes of the result at the given index.
+             */
+            public com.google.protobuf.ByteString getResultBytes(int index) {
+                return result_.getByteString(index);
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @param index The index to set the value at.
+             * @param value The result to set.
+             * @return This builder for chaining.
+             */
+            public Builder setResult(
+                    int index, java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ensureResultIsMutable();
+                result_.set(index, value);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @param value The result to add.
+             * @return This builder for chaining.
+             */
+            public Builder addResult(
+                    java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ensureResultIsMutable();
+                result_.add(value);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @param values The result to add.
+             * @return This builder for chaining.
+             */
+            public Builder addAllResult(
+                    java.lang.Iterable values) {
+                ensureResultIsMutable();
+                com.google.protobuf.AbstractMessageLite.Builder.addAll(
+                        values, result_);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @return This builder for chaining.
+             */
+            public Builder clearResult() {
+                result_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+                bitField0_ = (bitField0_ & ~0x00000001);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string result = 1;
+             * 
+             * @param value The bytes of the result to add.
+             * @return This builder for chaining.
+             */
+            public Builder addResultBytes(
+                    com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                ensureResultIsMutable();
+                result_.add(value);
+                onChanged();
+                return this;
+            }
+
+            @java.lang.Override
+            public final Builder setUnknownFields(
+                    final com.google.protobuf.UnknownFieldSet unknownFields) {
+                return super.setUnknownFields(unknownFields);
+            }
+
+            @java.lang.Override
+            public final Builder mergeUnknownFields(
+                    final com.google.protobuf.UnknownFieldSet unknownFields) {
+                return super.mergeUnknownFields(unknownFields);
+            }
+
+            // @@protoc_insertion_point(builder_scope:responseMessage.Response)
+        }
+
+        // @@protoc_insertion_point(class_scope:responseMessage.Response)
+        private static final responseMessage.ResponseOuterClass.Response DEFAULT_INSTANCE;
+        static {
+            DEFAULT_INSTANCE = new responseMessage.ResponseOuterClass.Response();
+        }
+
+        public static responseMessage.ResponseOuterClass.Response getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+            @java.lang.Override
+            public Response parsePartialFrom(
+                    com.google.protobuf.CodedInputStream input,
+                    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                    throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+                } catch (java.io.IOException e) {
+                    throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                            .setUnfinishedMessage(builder.buildPartial());
+                }
+                return builder.buildPartial();
+            }
+        };
+
+        public static com.google.protobuf.Parser parser() {
+            return PARSER;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Parser getParserForType() {
+            return PARSER;
+        }
+
+        @java.lang.Override
+        public responseMessage.ResponseOuterClass.Response getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+
+    }
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_responseMessage_Response_descriptor;
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_responseMessage_Response_fieldAccessorTable;
+
+    public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
+        return descriptor;
+    }
+
+    private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
+    static {
+        java.lang.String[] descriptorData = {
+                "\n\016response.proto\022\017responseMessage\"\032\n\010Res" +
+                        "ponse\022\016\n\006result\030\001 \003(\tB\023Z\021./responseMessa" +
+                        "geb\006proto3"
+        };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor
+                .internalBuildGeneratedFileFrom(descriptorData,
+                        new com.google.protobuf.Descriptors.FileDescriptor[] {
+                        });
+        internal_static_responseMessage_Response_descriptor = getDescriptor().getMessageTypes().get(0);
+        internal_static_responseMessage_Response_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+                internal_static_responseMessage_Response_descriptor,
+                new java.lang.String[] { "Result", });
+    }
+
+    // @@protoc_insertion_point(outer_class_scope)
+}
\ No newline at end of file
diff --git a/redis/src/main/java/site/ycsb/db/RedisModubftClient.java b/redis/src/main/java/site/ycsb/db/RedisModubftClient.java
new file mode 100644
index 0000000000..b84032ff80
--- /dev/null
+++ b/redis/src/main/java/site/ycsb/db/RedisModubftClient.java
@@ -0,0 +1,245 @@
+/**
+ * Copyright (c) 2012 YCSB contributors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you
+ * may not use this file except in compliance with the License. You
+ * may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License. See accompanying
+ * LICENSE file.
+ */
+
+/**
+ * Redis client binding for YCSB.
+ *
+ * All YCSB records are mapped to a Redis *hash field*.  For scanning
+ * operations, all keys are saved (by an arbitrary hash) in a sorted set.
+ */
+
+ package site.ycsb.db;
+
+ import site.ycsb.ByteIterator;
+ import site.ycsb.DB;
+ import site.ycsb.DBException;
+ import site.ycsb.Status;
+ 
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.io.OutputStream;
+ import java.net.Socket;
+ import java.nio.ByteBuffer;
+ import java.util.HashMap;
+ import java.util.Map;
+ import java.util.Properties;
+ import java.util.Set;
+ import java.util.Vector;
+ 
+ import queryMessage.Message;
+ import queryMessage.Message.Query;
+ import responseMessage.ResponseOuterClass.Response;
+ 
+ /**
+  * YCSB binding for Redis.
+  *
+  * See {@code redis/README.md} for details.
+  */
+ public class RedisModubftClient extends DB {
+ 
+   public static final String INDEX_KEY = "_indices";
+   private int moduBftClientPort = 10000;
+ 
+   private Socket activeConnection;
+ 
+   private OutputStream out;
+   private InputStream in;
+ 
+   private int tId;
+ 
+   public void init() throws DBException {
+     try {
+       Properties props = getProperties();
+       tId = Integer.parseInt(props.getProperty("threadId"));
+       moduBftClientPort += tId;
+       activeConnection = new Socket("localhost", moduBftClientPort);
+       out = activeConnection.getOutputStream();
+       in = activeConnection.getInputStream();
+     } catch (Exception e) {
+       throw new DBException(
+           String.format("Failed to establish  connection with modubft client at port %d", moduBftClientPort), e);
+     }
+   }
+ 
+   public void cleanup() throws DBException {
+     return;
+   }
+ 
+   /*
+    * Calculate a hash for a key to store it in an index. The actual return value
+    * of this function is not interesting -- it primarily needs to be fast and
+    * scattered along the whole space of doubles. In a real world scenario one
+    * would probably use the ASCII values of the keys.
+    */
+   private double hash(String key) {
+     return key.hashCode();
+   }
+ 
+   @Override
+   public Status read(String table, String key, Set fields,
+       Map result) {
+     Response resp;
+     if (fields == null) {
+       resp = sendQuery("HGETALL", key);
+     } else {
+       String[] args = new String[2 + fields.size()];
+       String[] fieldsArray = (String[]) fields.toArray();
+       args[0] = "HMGET";
+       args[1] = key;
+ 
+       for (int i = 2; i < 2 + fields.size(); i++) {
+         args[i] = fieldsArray[i - 2];
+       }
+       resp = sendQuery(args);
+     }
+     if (resp.getResultCount() > 0) {
+       return Status.OK;
+     } else {
+       return Status.ERROR;
+     }
+   }
+ 
+   @Override
+   public Status insert(String table, String key,
+       Map values) {
+     String[] args = new String[values.size() * 2 + 2];
+     args[0] = "HMSET";
+     args[1] = key;
+     int index = 2;
+     for (Map.Entry entry : values.entrySet()) {
+       args[index++] = entry.getKey();
+       args[index++] = entry.getValue().toString();
+     }
+ 
+     Response respHmset = sendQuery(args);
+
+ 
+     if (respHmset.getResult(0).equals("OK")) {
+       sendQuery("ZADD", INDEX_KEY, Double.toString(hash(key)), key);
+       return Status.OK;
+     } else {
+       return Status.ERROR;
+     }
+ 
+   }
+ 
+   @Override
+   public Status delete(String table, String key) {
+ 
+     Response respDel = sendQuery("DEL", key);
+ 
+     if (Integer.parseInt(respDel.getResult(0)) == 0) {
+       Response respZrem = sendQuery("ZREM", key);
+       if (Integer.parseInt(respZrem.getResult(0)) == 0) {
+         return Status.OK;
+       }
+     }
+     return Status.ERROR;
+ 
+   }
+ 
+   @Override
+   public Status update(String table, String key,
+       Map values) {
+     String[] args = new String[values.size() * 2 + 2];
+     args[0] = "HMSET";
+     args[1] = key;
+     int index = 2;
+     for (Map.Entry entry : values.entrySet()) {
+       args[index++] = entry.getKey();
+       args[index++] = entry.getValue().toString();
+     }
+     Response resp = sendQuery(args);
+     if (resp.getResultCount() > 0 && resp.getResult(0).equals("OK")) {
+       return Status.OK;
+     } else {
+       return Status.ERROR;
+     }
+ 
+   }
+ 
+   @Override
+   public Status scan(String table, String startkey, int recordcount,
+       Set fields, Vector> result) {
+     throw new UnsupportedOperationException("Scan is not offered yet");
+   }
+ 
+   private Response sendQuery(String... args) {
+ 
+     try {
+       //System.out.println("sendQuery in thread: " + tId);
+       byte[] msg = transformArgsToProtoMessage(args);
+ 
+       byte[] length = ByteBuffer.allocate(4).putInt(msg.length).array();
+       out.write(length);
+       out.write(msg);
+       out.flush();
+       return getResponse(args);
+ 
+     } catch (Exception e) {
+       e.printStackTrace();
+       return Response.newBuilder().build();
+     }
+   }
+ 
+   private byte[] transformArgsToProtoMessage(String[] args) {
+     Message.Query.Builder queryBuilder = Query.newBuilder();
+     for (String s : args) {
+       queryBuilder.addValues(s);
+     }
+     Query query = queryBuilder.build();
+     byte[] data = query.toByteArray();
+     return data;
+   }
+
+ 
+   private Response getResponse(String... args) throws IOException {
+     byte[] lengthBuf = new byte[4];
+     int bytesRead = 0;
+ 
+     while (bytesRead < 4) {
+       int result = in.read(lengthBuf, bytesRead, 4 - bytesRead);
+       if (result == -1) {
+         if (bytesRead == 0) {
+           return null; // end of stream
+         } else {
+           throw new IOException("Unexpected end of stream");
+         }
+       }
+       bytesRead += result;
+     }
+     int length = ByteBuffer.wrap(lengthBuf).getInt();
+     if (length == 0) {
+       throw new IOException("response size can't be 0");
+     }
+     byte[] messageBytes = new byte[length];
+ 
+     bytesRead = 0;
+ 
+     while (bytesRead < length) {
+       int result = in.read(messageBytes, bytesRead, length);
+       if (result == -1) {
+         throw new IOException("Unexpected end of stream");
+       }
+       bytesRead += result;
+     }
+     Response response = Response.parseFrom(messageBytes);
+     return response;
+ 
+   }
+ 
+ }
\ No newline at end of file