[JAVA-3801] Updates nesting when using Combine Created: 28/Jul/20  Updated: 27/Oct/23  Resolved: 28/Jul/20

Status: Closed
Project: Java Driver
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Barron Anderson Assignee: Ross Lawley
Resolution: Works as Designed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Java 1.8, Driver 3.12.5, MongoDB 3.6.14.



 Description   

When using Updates.combine() on an existing Bson update object it seems to nest the updates in the driver.  Is there a better way to combine (tack-on) additional update commands to an existing update Bson object?   

 

Example Code:

 
@Test
	public void testNestingOfUpdates()
	{
		Bson update = Updates.set("field1", "somedata1");
		update = Updates.combine(update, Updates.set("field2", "somedata2"));
		update = Updates.combine(update, Updates.set("field3", "somedata3"));
		update = Updates.combine(update, Updates.set("field4", "somedata4"));
		update = Updates.combine(update, Updates.set("field5", "somedata5"));
		update = Updates.combine(update, Updates.set("field6", "somedata6"));
		update = Updates.combine(update, Updates.set("field7", "somedata7"));
		update = Updates.combine(update, Updates.set("field8", "somedata8"));
		update = Updates.combine(update, Updates.set("field9", "somedata9"));		                
                String x = update.toString();
		System.out.println(x);
	}
 

Example output:

 

 
Updates{updates=[Updates{updates=[Updates{updates=[Updates{updates=[Updates{updates=[Updates{updates=[Updates{updates=[Updates{updates=[Update{fieldName='field1', operator='$set', value=somedata1}, Update{fieldName='field2', operator='$set', value=somedata2}]}, Update{fieldName='field3', operator='$set', value=somedata3}]}, Update{fieldName='field4', operator='$set', value=somedata4}]}, Update{fieldName='field5', operator='$set', value=somedata5}]}, Update{fieldName='field6', operator='$set', value=somedata6}]}, Update{fieldName='field7', operator='$set', value=somedata7}]}, Update{fieldName='field8', operator='$set', value=somedata8}]}, Update{fieldName='field9', operator='$set', value=somedata9}]}



 Comments   
Comment by Ross Lawley [ 28/Jul/20 ]

Thanks barron.anderson,

Looks like I jumped the gun, asking you to add this ticket, the toString just outputs the updates, which in this case causes some recursion.

As the Bson data is created as expected:

        BsonDocument doc = update.toBsonDocument(BsonDocument.class, MongoClientSettings.getDefaultCodecRegistry());
        System.out.println(doc.toJson());

So closing as works as designed.

An alternative way to use the API which produces a less scary toString() result would be:

List<Bson> updates = Arrays.asList(
        Updates.set("field1", "somedata1"),
        Updates.set("field2", "somedata2"),
        Updates.set("field3", "somedata3"),
        Updates.set("field4", "somedata4"),
        Updates.set("field5", "somedata5"),
        Updates.set("field6", "somedata6"),
        Updates.set("field7", "somedata7"),
        Updates.set("field8", "somedata8"),
        Updates.set("field9", "somedata9")
);
Bson update = Updates.combine(updates);

Generated at Thu Feb 08 09:00:28 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.