2828import org .springframework .data .mongodb .core .bulk .BulkOperation ;
2929import org .springframework .data .mongodb .core .bulk .BulkOperation .Insert ;
3030import org .springframework .data .mongodb .core .bulk .BulkOperation .Remove ;
31+ import org .springframework .data .mongodb .core .bulk .BulkOperation .RemoveFirst ;
3132import org .springframework .data .mongodb .core .bulk .BulkOperation .Replace ;
3233import org .springframework .data .mongodb .core .bulk .BulkOperation .Update ;
33- import org .springframework .data .mongodb .core .bulk .BulkOperation .UpdateSingle ;
34+ import org .springframework .data .mongodb .core .bulk .BulkOperation .UpdateFirst ;
3435import org .springframework .data .mongodb .core .mapping .MongoPersistentEntity ;
3536import org .springframework .data .mongodb .core .mapping .event .AfterSaveEvent ;
3637
4041import com .mongodb .client .model .UpdateOptions ;
4142import com .mongodb .client .model .bulk .ClientBulkWriteOptions ;
4243import com .mongodb .client .model .bulk .ClientBulkWriteResult ;
43- import com .mongodb .client .model .bulk .ClientDeleteManyOptions ;
4444import com .mongodb .client .model .bulk .ClientNamespacedWriteModel ;
45- import com .mongodb .client .model .bulk .ClientReplaceOneOptions ;
46- import com .mongodb .client .model .bulk .ClientUpdateManyOptions ;
47- import com .mongodb .client .model .bulk .ClientUpdateOneOptions ;
4845
4946/**
5047 * Internal API wrapping a {@link MongoTemplate} to encapsulate {@link Bulk} handling.
@@ -81,7 +78,7 @@ public ClientBulkWriteResult write(String defaultDatabase, Order order, Bulk bul
8178 } else if (bulkOp instanceof Update update ) {
8279
8380 Class <?> domainType = update .context ().namespace ().type ();
84- boolean multi = !(bulkOp instanceof UpdateSingle );
81+ boolean multi = !(bulkOp instanceof UpdateFirst );
8582
8683 UpdateContext updateContext = template .getQueryOperations ().updateContext (update .update (), update .query (),
8784 update .upsert ());
@@ -93,37 +90,9 @@ public ClientBulkWriteResult write(String defaultDatabase, Order order, Bulk bul
9390 UpdateOptions updateOptions = updateContext .getUpdateOptions (domainType , update .query ());
9491
9592 if (multi ) {
96-
97- ClientUpdateManyOptions updateManyOptions = ClientUpdateManyOptions .clientUpdateManyOptions ();
98- updateManyOptions .arrayFilters (updateOptions .getArrayFilters ());
99- updateManyOptions .collation (updateOptions .getCollation ());
100- updateManyOptions .upsert (updateOptions .isUpsert ());
101- updateManyOptions .hint (updateOptions .getHint ());
102- updateManyOptions .hintString (updateOptions .getHintString ());
103-
104- if (mappedUpdate instanceof List <?> pipeline ) {
105- writeModels .add (ClientNamespacedWriteModel .updateMany (mongoNamespace , mappedQuery ,
106- (List <Document >) pipeline , updateManyOptions ));
107- } else {
108- writeModels .add (ClientNamespacedWriteModel .updateMany (mongoNamespace , mappedQuery , (Document ) mappedUpdate ,
109- updateManyOptions ));
110- }
93+ writeModels .add (BulkWriteSupport .updateMany (mongoNamespace , mappedQuery , mappedUpdate , updateOptions ));
11194 } else {
112-
113- ClientUpdateOneOptions updateOneOptions = ClientUpdateOneOptions .clientUpdateOneOptions ();
114- updateOneOptions .arrayFilters (updateOptions .getArrayFilters ());
115- updateOneOptions .collation (updateOptions .getCollation ());
116- updateOneOptions .upsert (updateOptions .isUpsert ());
117- updateOneOptions .hint (updateOptions .getHint ());
118- updateOneOptions .hintString (updateOptions .getHintString ());
119-
120- if (mappedUpdate instanceof List <?> pipeline ) {
121- writeModels .add (ClientNamespacedWriteModel .updateOne (mongoNamespace , mappedQuery , (List <Document >) pipeline ,
122- updateOneOptions ));
123- } else {
124- writeModels .add (ClientNamespacedWriteModel .updateOne (mongoNamespace , mappedQuery , (Document ) mappedUpdate ,
125- updateOneOptions ));
126- }
95+ writeModels .add (BulkWriteSupport .updateOne (mongoNamespace , mappedQuery , mappedUpdate , updateOptions ));
12796 }
12897 } else if (bulkOp instanceof Remove remove ) {
12998
@@ -132,12 +101,12 @@ public ClientBulkWriteResult write(String defaultDatabase, Order order, Bulk bul
132101
133102 Document mappedQuery = deleteContext .getMappedQuery (template .getPersistentEntity (domainType ));
134103 DeleteOptions deleteOptions = deleteContext .getDeleteOptions (domainType );
135- ClientDeleteManyOptions clientDeleteManyOptions = ClientDeleteManyOptions .clientDeleteManyOptions ();
136- clientDeleteManyOptions .collation (deleteOptions .getCollation ());
137- clientDeleteManyOptions .hint (deleteOptions .getHint ());
138- clientDeleteManyOptions .hintString (deleteOptions .getHintString ());
139104
140- writeModels .add (ClientNamespacedWriteModel .deleteMany (mongoNamespace , mappedQuery , clientDeleteManyOptions ));
105+ if (remove instanceof RemoveFirst ) {
106+ writeModels .add (BulkWriteSupport .removeOne (mongoNamespace , mappedQuery , deleteOptions ));
107+ } else {
108+ writeModels .add (BulkWriteSupport .removeMany (mongoNamespace , mappedQuery , deleteOptions ));
109+ }
141110 } else if (bulkOp instanceof Replace replace ) {
142111
143112 Class <?> domainType = replace .context ().namespace ().type ();
@@ -151,15 +120,8 @@ public ClientBulkWriteResult write(String defaultDatabase, Order order, Bulk bul
151120 Document mappedQuery = updateContext .getMappedQuery (template .getPersistentEntity (domainType ));
152121 UpdateOptions updateOptions = updateContext .getUpdateOptions (domainType , replace .query ());
153122
154- ClientReplaceOneOptions replaceOptions = ClientReplaceOneOptions .clientReplaceOneOptions ();
155- replaceOptions .upsert (updateOptions .isUpsert ());
156- replaceOptions .sort (updateOptions .getSort ());
157- replaceOptions .hint (updateOptions .getHint ());
158- replaceOptions .hintString (updateOptions .getHintString ());
159- replaceOptions .collation (updateOptions .getCollation ());
160-
161- writeModels .add (ClientNamespacedWriteModel .replaceOne (mongoNamespace , mappedQuery ,
162- sourceAwareDocument .document (), replaceOptions ));
123+ writeModels .add (
124+ BulkWriteSupport .replaceOne (mongoNamespace , mappedQuery , sourceAwareDocument .document (), updateOptions ));
163125 afterSaveCallables .add (sourceAwareDocument );
164126 }
165127 }
@@ -170,7 +132,8 @@ public ClientBulkWriteResult write(String defaultDatabase, Order order, Bulk bul
170132 ClientBulkWriteOptions .clientBulkWriteOptions ().ordered (order .equals (Order .SEQUENTIAL ))));
171133
172134 afterSaveCallables .forEach (callable -> {
173- template .maybeEmitEvent (new AfterSaveEvent <>(callable .source (), callable .document (), callable .collectionName ()));
135+ template
136+ .maybeEmitEvent (new AfterSaveEvent <>(callable .source (), callable .document (), callable .collectionName ()));
174137 template .maybeCallAfterSave (callable .source (), callable .document (), callable .collectionName ());
175138 });
176139 return clientBulkWriteResult ;
0 commit comments