diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 70f80f0d5..d26ae5782 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -376,8 +376,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, * @see org.springframework.data.mongodb.core.MongoOperations#executeAsStream(org.springframework.data.mongodb.core.query.Query, java.lang.Class) */ @Override - public CloseableIterator stream(final Query query, final Class entityType) { - + public CloseableIterator stream(Query query, Class entityType) { return stream(query, entityType, getCollectionName(entityType)); } @@ -386,11 +385,11 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, * @see org.springframework.data.mongodb.core.MongoOperations#stream(org.springframework.data.mongodb.core.query.Query, java.lang.Class, java.lang.String) */ @Override - public CloseableIterator stream(final Query query, final Class entityType, final String collectionName) { + public CloseableIterator stream(Query query, Class entityType, String collectionName) { return doStream(query, entityType, collectionName, entityType); } - protected CloseableIterator doStream(final Query query, final Class entityType, final String collectionName, + protected CloseableIterator doStream(Query query, final Class entityType, String collectionName, Class returnType) { Assert.notNull(query, "Query must not be null!"); @@ -404,7 +403,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, public CloseableIterator doInCollection(MongoCollection collection) throws MongoException, DataAccessException { - MongoPersistentEntity persistentEntity = mappingContext.getRequiredPersistentEntity(entityType); + MongoPersistentEntity persistentEntity = mappingContext.getPersistentEntity(entityType); Document mappedFields = getMappedFieldsObject(query.getFieldsObject(), persistentEntity, returnType); Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), persistentEntity); @@ -2419,7 +2418,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, List doFind(String collectionName, Document query, Document fields, Class sourceClass, Class targetClass, CursorPreparer preparer) { - MongoPersistentEntity entity = mappingContext.getRequiredPersistentEntity(sourceClass); + MongoPersistentEntity entity = mappingContext.getPersistentEntity(sourceClass); Document mappedFields = getMappedFieldsObject(fields, entity, targetClass); Document mappedQuery = queryMapper.getMappedObject(query, entity); @@ -2754,7 +2753,12 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, return queryMapper.getMappedSort(query.getSortObject(), mappingContext.getPersistentEntity(type)); } - private Document getMappedFieldsObject(Document fields, MongoPersistentEntity entity, Class targetType) { + private Document getMappedFieldsObject(Document fields, @Nullable MongoPersistentEntity entity, + Class targetType) { + + if (entity == null) { + return fields; + } Document projectedFields = propertyOperations.computeFieldsForProjection(projectionFactory, fields, entity.getType(), targetType); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index a14ee5959..d86418a0c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -375,8 +375,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati * @see org.springframework.data.mongodb.core.ReactiveMongoOperations#reactiveIndexOps(java.lang.Class) */ public ReactiveIndexOperations indexOps(Class entityClass) { - return new DefaultReactiveIndexOperations(this, getCollectionName(entityClass), this.queryMapper, - entityClass); + return new DefaultReactiveIndexOperations(this, getCollectionName(entityClass), this.queryMapper, entityClass); } public String getCollectionName(Class entityClass) { @@ -615,8 +614,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati */ public Mono> createCollection(Class entityClass, @Nullable CollectionOptions collectionOptions) { - return doCreateCollection(getCollectionName(entityClass), - convertToCreateCollectionOptions(collectionOptions, entityClass)); + return doCreateCollection(getCollectionName(entityClass), convertToCreateCollectionOptions(collectionOptions, entityClass)); } /* @@ -1965,8 +1963,8 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati public Flux mapReduce(Query filterQuery, Class domainType, Class resultType, String mapFunction, String reduceFunction, MapReduceOptions options) { - return mapReduce(filterQuery, domainType, getCollectionName(domainType), resultType, mapFunction, - reduceFunction, options); + return mapReduce(filterQuery, domainType, getCollectionName(domainType), resultType, mapFunction, reduceFunction, + options); } /* @@ -2255,7 +2253,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati Flux doFind(String collectionName, Document query, Document fields, Class sourceClass, Class targetClass, FindPublisherPreparer preparer) { - MongoPersistentEntity entity = mappingContext.getRequiredPersistentEntity(sourceClass); + MongoPersistentEntity entity = mappingContext.getPersistentEntity(sourceClass); Document mappedFields = getMappedFieldsObject(fields, entity, targetClass); Document mappedQuery = queryMapper.getMappedObject(query, entity); @@ -2269,7 +2267,12 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati new ProjectingReadCallback<>(mongoConverter, sourceClass, targetClass, collectionName), collectionName); } - private Document getMappedFieldsObject(Document fields, MongoPersistentEntity entity, Class targetType) { + private Document getMappedFieldsObject(Document fields, @Nullable MongoPersistentEntity entity, + Class targetType) { + + if (entity == null) { + return fields; + } Document projectedFields = propertyOperations.computeFieldsForProjection(projectionFactory, fields, entity.getType(), targetType); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java index ab884686e..2e34c0ef4 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java @@ -147,6 +147,13 @@ public class ExecutableFindOperationSupportTests { .hasSize(1); } + @Test // DATAMONGO-2323 + public void findAllAsDocument() { + assertThat( + template.query(Document.class).inCollection(STAR_WARS).matching(query(where("firstname").is("luke"))).all()) + .hasSize(1); + } + @Test // DATAMONGO-1563 public void findAllByWithProjection() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 8af2f8d01..c7cbfa01a 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -3346,7 +3346,7 @@ public class MongoTemplateTests { assertThat(loaded.bigDeciamVal, equalTo(new BigDecimal("800"))); } - @Test // DATAMONGO-1431 + @Test // DATAMONGO-1431, DATAMONGO-2323 public void streamExecutionUsesExplicitCollectionName() { template.remove(new Query(), "some_special_collection"); @@ -3357,14 +3357,14 @@ public class MongoTemplateTests { template.insert(document, "some_special_collection"); CloseableIterator stream = template.stream(new Query(), Document.class); - assertThat(stream.hasNext(), is(false)); - stream = template.stream(new Query(), Document.class, "some_special_collection"); + CloseableIterator stream2 = template.stream(new Query(where("_id").is(document.id)), + org.bson.Document.class, "some_special_collection"); - assertThat(stream.hasNext(), is(true)); - assertThat(stream.next().id, is(document.id)); - assertThat(stream.hasNext(), is(false)); + assertThat(stream2.hasNext()).isTrue(); + assertThat(stream2.next().get("_id")).isEqualTo(new ObjectId(document.id)); + assertThat(stream2.hasNext()).isFalse(); } @Test // DATAMONGO-1194 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveFindOperationSupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveFindOperationSupportTests.java index 2e6e55422..5139d7362 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveFindOperationSupportTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveFindOperationSupportTests.java @@ -134,6 +134,12 @@ public class ReactiveFindOperationSupportTests { StepVerifier.create(template.query(Human.class).inCollection(STAR_WARS).all()).expectNextCount(2).verifyComplete(); } + @Test // DATAMONGO-2323 + public void findAllAsDocumentDocument() { + StepVerifier.create(template.query(Document.class).inCollection(STAR_WARS).all()).expectNextCount(2) + .verifyComplete(); + } + @Test // DATAMONGO-1719 public void findAllWithProjection() {