diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Aggregation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Aggregation.java index e5a587c9b8..904401b0a9 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Aggregation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Aggregation.java @@ -307,7 +307,13 @@ public static SkipOperation skip(int elementsToSkip) { public static LimitOperation limit(long maxElements) { return new LimitOperation(maxElements); } - + /** + * Creates a new {@link OutOperation} creating new collection. + * + * @param out collection name must not null. + * @return + */ + public static OutOperation out(String out){return new OutOperation(out);} /** * Creates a new {@link MatchOperation} using the given {@link Criteria}. * diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/OutOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/OutOperation.java new file mode 100644 index 0000000000..5cb3b85a02 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/OutOperation.java @@ -0,0 +1,49 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.core.aggregation; + +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import org.springframework.util.Assert; + + +/** + * Encapsulates the aggregation framework {@code $out}-operation. We recommend to use the static factory method + * {@link Aggregation#out(String)} instead of creating instances of this class directly. + * + * @author Shweta Gupta + * @see https://docs.mongodb.org/manual/reference/operator/aggregation/out/ + * @since 1.9 + */ +public class OutOperation implements AggregationOperation{ + private final String out; + /** + * @param out Output collection name. + */ + public OutOperation(String out) { + Assert.notNull(out, "Out must not be null!"); + this.out = out; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDBObject(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext) + */ + @Override + public DBObject toDBObject(AggregationOperationContext context) { + return new BasicDBObject("$out",out); + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java index 4caf61f070..57d9758482 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java @@ -853,6 +853,43 @@ public void shouldAllowGroupByIdFields() { assertThat(String.valueOf(firstItem.get("_id")), is("u1")); } + + + /** + * @see DATAMONGO-1358 + */ + @Test + public void shouldSupportOutAggregation() { + + mongoTemplate.dropCollection(User.class); + + LocalDateTime now = new LocalDateTime(); + + User user1 = new User("u1", new PushMessage("1", "aaa", now.toDate())); + User user2 = new User("u2", new PushMessage("2", "bbb", now.minusDays(2).toDate())); + User user3 = new User("u3", new PushMessage("3", "ccc", now.minusDays(1).toDate())); + + mongoTemplate.save(user1); + mongoTemplate.save(user2); + mongoTemplate.save(user3); + + Aggregation agg = newAggregation( // + project("id", "msgs"), // + unwind("msgs"), // + match(where("msgs.createDate").gt(now.minusDays(1).toDate())), // + group("id").push("msgs").as("msgs"),out("userDetails") // + ); + + AggregationResults results = mongoTemplate.aggregate(agg, User.class, DBObject.class); + System.out.println(results.getRawResults()); + + List mappedResults = mongoTemplate.findAll(DBObject.class,"userDetails"); + + DBObject firstItem = mappedResults.get(0); + assertThat(firstItem.get("_id"), is(notNullValue())); + assertThat(String.valueOf(firstItem.get("_id")), is("u1")); +} + /** * @see DATAMONGO-840 */