DocumentMutation.merge()

Merges a document with a nested document that is in an existing document with the OJAI DocumentMutationinterface. The DocumentMutation interface defines the APIs that perform mutations of a document already stored in a DocumentStore.

Operations Performed

  1. Verifies that a field at the specified path exists. If the field at the specified path does not exist, this operation creates it with the specified value.
  2. Verifies that the field is of the Map type.
  3. Merges the passed value with the existing value.

Example of Merging Documents

Original Document
{
    "_id" : "000001",
    "a" : {
        "b" : {
            "c" : 1,
            "d" : "abd",
            "e" : 2
           }
      }
}
Document to Merge at the field path a.b
{
    "c" : 3,
    "d" : "replacedString",
    "newField1" : "newStringValue",
    "newField2" : 4
}
Example Code for the merge
public Document buildDocument() {
    return MapRDB.newDocument()
      .set("c", 3)
      .set("d", "replacedString")
      .set(newField1", "newStringValue")
      .set(newField2", 4);
  }


  public DocumentMutation buildDocumentMutation() {
    return MapRDB.newDocumentMutation()
      .merge("a", ImmutableMap.of(
        "b", document));
  }

  public void update(String tablePath, DocumentMutation mutation, String _id) {
    try(Table table = MapRDB.getTable(tablePath)) {
      table.update(_id, mutation);
    }
  }
Parameter Description
_id The value of the document's _id field.
tablePath The path of the table in the MapR file system. See the "Table Paths" section in MapR-DB JSON Tables.
Merged Document
{ 
   "_id" : "000001", 
   "a":{  
      "b":{  
         "e":2,
         "c":3,
         "d":"replacedString",
         "newField1":"newStrValue",
         "newField2":4
      }
   }
}

Permissions Required

Link to Javadoc

DocumentMutation

Important: If a DocumentMutation object modifies a field two or more times, only the final operation on that field is applied.

Example One

table.update() in the last line fails with error code 22:

DBDocument doc = MapRDB.newDocument()
        .set("int", 100)
        .set("date", new Date(1000))
        .set("string", "a string");

table.insertOrReplace("doc1", doc);

// Set different fields
DocumentMutation mutation = MapRDB.newDocumentMutation();
mutation.setOrReplace("string", 1000);
mutation.set("string", 2000);

table.update("doc1", mutation);

Example Two

This code results in the document {"string":"a string add3"}, rather than the document {"string":"a string add1 add2 add3"}.

DBDocument doc = MapRDB.newDocument()
        .set("string", "a string");

table.insertOrReplace("doc1", record);

DocumentMutation mutation = MapRDB.newDocumentMutation();
mutation.append("string", " add1");
mutation.append("string", " add2");
mutation.append("string", " add3");

table.update("doc1", mutation);