1414package com .querydsl .mongodb ;
1515
1616import com .mongodb .BasicDBObject ;
17- import com .mongodb .DBCollection ;
18- import com .mongodb .DBCursor ;
19- import com .mongodb .DBObject ;
2017import com .mongodb .ReadPreference ;
18+ import com .mongodb .client .FindIterable ;
19+ import com .mongodb .client .MongoCollection ;
2120import com .querydsl .core .CloseableIterator ;
2221import com .querydsl .core .DefaultQueryMetadata ;
2322import com .querydsl .core .Fetchable ;
4443import java .util .List ;
4544import java .util .Map ;
4645import java .util .function .Function ;
46+ import org .bson .conversions .Bson ;
4747import org .jetbrains .annotations .Nullable ;
4848
4949/**
@@ -64,22 +64,22 @@ private static class NoResults extends RuntimeException {}
6464
6565 private final QueryMixin <Q > queryMixin ;
6666
67- private final DBCollection collection ;
67+ private final MongoCollection collection ;
6868
69- private final Function <DBObject , K > transformer ;
69+ private final Function <K , Object > transformer ;
7070
7171 private ReadPreference readPreference ;
7272
7373 /**
7474 * Create a new MongodbQuery instance
7575 *
7676 * @param collection collection
77- * @param transformer result transformer
77+ * @param transformer id transformer
7878 * @param serializer serializer
7979 */
8080 @ SuppressWarnings ("unchecked" )
8181 public AbstractMongodbQuery (
82- DBCollection collection , Function <DBObject , K > transformer , MongodbSerializer serializer ) {
82+ MongoCollection collection , Function <K , Object > transformer , MongodbSerializer serializer ) {
8383 @ SuppressWarnings ("unchecked" ) // Q is this plus subclass
8484 var query = (Q ) this ;
8585 this .queryMixin = new QueryMixin <>(query , new DefaultQueryMetadata (), false );
@@ -122,7 +122,7 @@ public <T> AnyEmbeddedBuilder<Q, K> anyEmbedded(
122122 return new AnyEmbeddedBuilder <>(queryMixin , collection );
123123 }
124124
125- protected abstract DBCollection getCollection (Class <?> type );
125+ protected abstract MongoCollection getCollection (Class <?> type );
126126
127127 @ Nullable
128128 protected Predicate createFilter (QueryMetadata metadata ) {
@@ -164,16 +164,15 @@ protected List<Object> getIds(Class<?> targetType, Predicate condition) {
164164 // TODO : fetch only ids
165165 var cursor =
166166 createCursor (
167- collection ,
168- condition ,
169- null ,
170- QueryModifiers .EMPTY ,
171- Collections .<OrderSpecifier <?>>emptyList ());
167+ collection ,
168+ condition ,
169+ null ,
170+ QueryModifiers .EMPTY ,
171+ Collections .<OrderSpecifier <?>>emptyList ())
172+ .cursor ();
172173 if (cursor .hasNext ()) {
173- List <Object > ids = new ArrayList <>(cursor .count ());
174- for (DBObject obj : cursor ) {
175- ids .add (obj .get ("_id" ));
176- }
174+ List <Object > ids = new ArrayList <>();
175+ cursor .forEachRemaining (document -> ids .add (transformer .apply (document )));
177176 return ids ;
178177 } else {
179178 return Collections .emptyList ();
@@ -236,7 +235,7 @@ public CloseableIterator<K> iterate(Path<?>... paths) {
236235
237236 @ Override
238237 public CloseableIterator <K > iterate () {
239- final var cursor = createCursor ();
238+ final var cursor = createCursor (). cursor () ;
240239 return new CloseableIterator <>() {
241240 @ Override
242241 public boolean hasNext () {
@@ -245,7 +244,7 @@ public boolean hasNext() {
245244
246245 @ Override
247246 public K next () {
248- return transformer . apply ( cursor .next () );
247+ return cursor .next ();
249248 }
250249
251250 @ Override
@@ -272,16 +271,16 @@ public List<K> fetch() {
272271 try {
273272 var cursor = createCursor ();
274273 List <K > results = new ArrayList <>();
275- for (DBObject dbObject : cursor ) {
276- results .add (transformer . apply ( dbObject ) );
274+ for (K dbObject : cursor ) {
275+ results .add (dbObject );
277276 }
278277 return results ;
279278 } catch (NoResults ex ) {
280279 return Collections .emptyList ();
281280 }
282281 }
283282
284- protected DBCursor createCursor () {
283+ protected FindIterable < K > createCursor () {
285284 var metadata = queryMixin .getMetadata ();
286285 Predicate filter = createFilter (metadata );
287286 return createCursor (
@@ -292,13 +291,19 @@ protected DBCursor createCursor() {
292291 metadata .getOrderBy ());
293292 }
294293
295- protected DBCursor createCursor (
296- DBCollection collection ,
294+ protected FindIterable < K > createCursor (
295+ MongoCollection collection ,
297296 @ Nullable Predicate where ,
298297 Expression <?> projection ,
299298 QueryModifiers modifiers ,
300299 List <OrderSpecifier <?>> orderBy ) {
301- var cursor = collection .find (createQuery (where ), createProjection (projection ));
300+ var cursor =
301+ readPreference != null
302+ ? collection
303+ .withReadPreference (readPreference )
304+ .find (createQuery (where ))
305+ .projection (createProjection (projection ))
306+ : collection .find (createQuery (where )).projection (createProjection (projection ));
302307 Integer limit = modifiers .getLimitAsInteger ();
303308 Integer offset = modifiers .getOffsetAsInteger ();
304309 if (limit != null ) {
@@ -310,15 +315,12 @@ protected DBCursor createCursor(
310315 if (orderBy .size () > 0 ) {
311316 cursor .sort (serializer .toSort (orderBy ));
312317 }
313- if (readPreference != null ) {
314- cursor .setReadPreference (readPreference );
315- }
316318 return cursor ;
317319 }
318320
319- private DBObject createProjection (Expression <?> projection ) {
321+ private Bson createProjection (Expression <?> projection ) {
320322 if (projection instanceof FactoryExpression ) {
321- DBObject obj = new BasicDBObject ();
323+ var obj = new BasicDBObject ();
322324 for (Object expr : ((FactoryExpression ) projection ).getArgs ()) {
323325 if (expr instanceof Expression ) {
324326 obj .put ((String ) serializer .handle ((Expression ) expr ), 1 );
@@ -343,9 +345,9 @@ public K fetchFirst(Path<?>... paths) {
343345 @ Override
344346 public K fetchFirst () {
345347 try {
346- var c = createCursor ().limit (1 );
348+ var c = createCursor ().limit (1 ). cursor () ;
347349 if (c .hasNext ()) {
348- return transformer . apply ( c .next () );
350+ return c .next ();
349351 } else {
350352 return null ;
351353 }
@@ -372,9 +374,9 @@ public K fetchOne() throws NonUniqueResultException {
372374 if (limit == null ) {
373375 limit = 2L ;
374376 }
375- var c = createCursor ().limit (limit .intValue ());
377+ var c = createCursor ().limit (limit .intValue ()). cursor () ;
376378 if (c .hasNext ()) {
377- var rv = transformer . apply ( c .next () );
379+ var rv = c .next ();
378380 if (c .hasNext ()) {
379381 throw new NonUniqueResultException ();
380382 }
@@ -416,15 +418,15 @@ public QueryResults<K> fetchResults() {
416418 public long fetchCount () {
417419 try {
418420 Predicate filter = createFilter (queryMixin .getMetadata ());
419- return collection .count (createQuery (filter ));
421+ return collection .countDocuments (createQuery (filter ));
420422 } catch (NoResults ex ) {
421423 return 0L ;
422424 }
423425 }
424426
425- private DBObject createQuery (@ Nullable Predicate predicate ) {
427+ private Bson createQuery (@ Nullable Predicate predicate ) {
426428 if (predicate != null ) {
427- return (DBObject ) serializer .handle (predicate );
429+ return (Bson ) serializer .handle (predicate );
428430 } else {
429431 return new BasicDBObject ();
430432 }
@@ -444,7 +446,7 @@ public void setReadPreference(ReadPreference readPreference) {
444446 *
445447 * @return
446448 */
447- public DBObject asDBObject () {
449+ public Bson asDBObject () {
448450 return createQuery (queryMixin .getMetadata ().getWhere ());
449451 }
450452
0 commit comments