EzyMongo: Custom Query Result
Updated at 1691028385000In 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<Duck> fetchDuckByAgeOptional
- Fine a list result, example:
List<Duck> 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
You can see how to connect to multi databases.