Uploaded image for project: 'Java Driver'
  1. Java Driver
  2. JAVA-3137

findOneAndUpdate with empty update will clear the document

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major - P3
    • Resolution: Duplicate
    • Affects Version/s: 3.9.1
    • Fix Version/s: None
    • Labels:
      None
    • Environment:
      Java 8, Windows 10, Mongo Java Driver 3.9.1, Mongo 3.4

      Description

      Here's my example code:

      import org.bson.Document;
       
      import com.mongodb.client.MongoClients;
      import com.mongodb.client.MongoCollection;
      import com.mongodb.client.model.FindOneAndUpdateOptions;
      import com.mongodb.client.model.ReturnDocument;
       
      public class MongoFindOneAndUpdateTest {
       
      	public static void main(String[] args) {
      		// I'm running mongo 3.4 locally
      		final String connStr = "mongodb://localhost:27017/test?ssl=false";
      		final MongoCollection<Document> col = MongoClients.create(connStr)
      				.getDatabase("test").getCollection("fakeCol");
      		// Make sure we start with an empty collection
      		col.drop();
      		// insert a simple document
      		col.insertOne(new Document()
      				.append("_id", "fakeId")
      				.append("one", 1)
      				.append("foo", "bar"));
      		{
      			final Document doc = col.find().iterator().next();
      			System.out.println(doc.toJson());
      			// prints { "_id" : "fakeId", "one" : 1, "foo" : "bar" } as expected
      		}
      		{
      			// Find a document with no filter and update it with no operation,
      			// and then return the updated document, at least that's what I expected to happen.
      			final Document doc = col.findOneAndUpdate(new Document(), new Document(),
      					new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER));
      			System.out.println(doc.toJson());
      			// prints { "_id" : "fakeId" }
      			// What???
      		}
      		{
      			// Just to be sure the previous result is correct
      			final Document doc = col.find().iterator().next();
      			System.out.println(doc.toJson());
      			// prints { "_id" : "fakeId" }
      			// Yeah, the document was for some reason obliterated
      		}
      		col.drop();
      	}
       
      }
      

       

      So basically if I do findOneAndUpdate with an empty Document, then it will clear out every field on the document found apart from _id.

       

      I tried the same thing in Mongo shell, and doing db.fakeCol.findOneAndUpdate({}, {}) is not even allowed. It says "the update operation document must contain at least one atomic operator".

       

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              Unassigned
              Reporter:
              slisaasquatch Siqi Li
              Participants:
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: