in mongodb/src/main/java/org/hibernate/ogm/datastore/mongodb/MongoDBDialect.java [1206:1250]
private ClosableIterator<Tuple> doFind(MongoDBQueryDescriptor query, QueryParameters queryParameters, MongoCollection<Document> collection,
EntityKeyMetadata entityKeyMetadata) {
Document criteria = query.getCriteria();
Document orderby = query.getOrderBy();
int maxTimeMS = -1;
Document modifiers = new Document();
// We need to extract the different parts of the criteria and pass them to the cursor API
if ( criteria.containsKey( "$query" ) ) {
if ( orderby == null ) {
orderby = (Document) criteria.get( "$orderby" );
}
maxTimeMS = criteria.getInteger( "$maxTimeMS", -1 );
addModifier( modifiers, criteria, "$hint" );
addModifier( modifiers, criteria, "$maxScan" );
addModifier( modifiers, criteria, "$snapshot", false );
addModifier( modifiers, criteria, "$min" );
addModifier( modifiers, criteria, "$max" );
addModifier( modifiers, criteria, "$comment" );
addModifier( modifiers, criteria, "$explain", false );
criteria = (Document) criteria.get( "$query" );
}
FindIterable<Document> prepareFind = collection.find( criteria ).modifiers( modifiers ).projection( query.getProjection() );
if ( orderby != null ) {
prepareFind.sort( orderby );
}
if ( maxTimeMS > 0 ) {
prepareFind.maxTime( maxTimeMS, TimeUnit.MILLISECONDS );
}
// apply firstRow/maxRows if present
if ( queryParameters.getRowSelection().getFirstRow() != null ) {
prepareFind.skip( queryParameters.getRowSelection().getFirstRow() );
}
if ( queryParameters.getRowSelection().getMaxRows() != null ) {
prepareFind.limit( queryParameters.getRowSelection().getMaxRows() );
}
MongoCursor<Document> iterator = prepareFind.iterator();
return new MongoDBResultsCursor( iterator, entityKeyMetadata, provider.getBinaryStorageManager() );
}