EzyMongo: Query Data

Updated at 1691032741000

1. Create a Repsitory

If you have no idea about EzyMongo, please take a look the introduction. And now, let's say we have a Book class like this:

    @EzyCollection
    public class Book {
        @EzyId
        private Long id;
        private Long categoryId;
        private Long authorId;
        private String name;
        private BigDecimal price;
        private LocalDate releaseDate;
        private LocalDateTime releaseTime;
    }

To create a repository, you just need add a repository like this:

    @EzyRepository
    public interface BookRepository extends EzyMongoRepository {}

2. Available methods

EzyMongo contains some method:

  1. save: to save one or many entities
  2. delete: to delete one or many entities
  3. find: to entities by id, ids, by field or find all
  4. count: count all entities

example:

    bookRepository.save(book);
    bookRepository.delete(bookId);
    Book book = bookRepository.findById(bookId);
    bookRepository.count()

For a completed example, you can look at here.

3. Custom method

EzyMongo supports you create a custom method to query mongodb. Let's say, we want to find a book by name and authorId, we can do like this:

    Book findByNameAndAuthorId(String name, Long authorId);

In this method, name is Book's name field and authorId is Book's authorId field. It means you can use this template to create a lot of query methods, like:

    List<Book> findByCategoryIdOrAuthorId(long category, long authorId);
    List<Book> findByCategoryIdAndName(long category, long authorId, Next next);
    int countByAuthorId(long authorId);

4. Custom query method

If you have a complicated query and can not create a custom method, you can annotate your method with @EzyQuery annotation like this:

    @EzyQuery("{$query: {_id : 4}, $update: {$set: {category: ?0}}}")
    void updateCategory(String category); // need to have "update" prefix.

    @EzyQuery("{$query:{name:{$lt:?0}}, $orderby:{name:1}}")
    List<Book> findByNameLt(String name, Next next);

    @EzyQuery("{$query:{name:{$gt:?0}}, $orderby:{name:1}}")
    List<Book> findByNameGt(String name, Next next);

    @EzyQuery("[{ $group: { _id : 'sum', sum : { $sum: {$toDecimal: '$price'}} } }]")
    SumBookPriceResult sumPrice();

    @EzyQuery("{authorId:{$gt:?0}}")
    int countByAuthorIdGt(long authorId); // need to have "count" prefix.

    @EzyQuery("{authorId:{$gt:?0}}")
    void deleteByAuthorIdGt(long authorId); // need to have "delete" prefix.

4. Pagination

EzyMongo use Next class to help you specific skip and limit value, you can create Next by:

    Next.fromSkipLimit(skip, limit)
    // or
    Next.fromPageSize(page, size)

Full source code of examples is available on Github

Next

You can take a look how to use custom query result