Custom query result

In a aggregate query, sometimes you don't want to select entire entity. EzyMongo will help you map query result to a result class.

1. Query

Let's say we have an entity class and a query method like this:
@Getter
@Setter
@ToString
@EzyCollection("test_mongo_duck")
@NoArgsConstructor
@AllArgsConstructor
public class Duck {
    @EzyCollectionId(composite = true)
    private DuckId id;
    private int age;
    private String description;
}
@EzyQuery(
    "[" +
    "{ $sort: { id: 1 }}," +
    "{ $match: { age: ?0 }}, " +
    "{ $project: { age: 0 } }" +
    "]"
)
DuckResult fetchDuckByAge(
    int age
);
Let's focus on { $project: { age: 0 } }, we don't want to select age field.

2. Result class

With 2 above Duck class and ignored age field, we will need create a class with 2 fields:
@Data
@EzyQueryResult
@NoArgsConstructor
@AllArgsConstructor
public class DuckResult {
    private DuckId id;
    private String description;
}
Don't for get @EzyQueryResult annotation, EzyMongo will need this annotation to recognize the result class and create deserializer class for it.

3. Use cases

You can use request class in 3 cases:
  • Find one nullable result, example: DuckResult fetchDuckByAge
  • Find one optional result, example: Optional<DuckResult> fetchDuckByAgeOptional
  • Fine a list result, example: List<DuckResult> fetchDuckByAgeList

4. An another way to fetch some fields

If you don't want to use aggregate, you can use find method with the entity, example:
@EzyQuery("{$query: {age: {$gte : ?0}}, $fields: ['id', 'age'], $orderBy : {age: -1}}")
List<Duck> findListDuckSomeFields(int age, Next next);
In this case, unselected fields will be default value.

Next