MongoRepository查询数据常用语法

博客 分享
0 221
优雅殿下
优雅殿下 2023-03-09 21:26:27
悬赏:0 积分 收藏

MongoRepository查询数据常用语法

安装

查看mongo可用版本

docker search mongo

安装指定版本的mogo或者拉取最新版本的镜像

docker pull mongo:latest

或者官网下载安装包
https://www.mongodb.com/try/download/community-kubernetes-operator
下载完成解压至自己的目录

tar -zxvf mongodb-macos-x86_64-4.2.18.tgz

创建mongo数据持久化目录

sudo mkdir -p /usr/local/var/mongodb

创建mongo数据库日志目录

sudo mkdir -p /usr/local/var/log/mongodb

分配权限
sudo chown my_mongodb_user /usr/local/var/mongodb
sudo chown my_mongodb_user /usr/local/var/log/mongodb
运行mongod服务

mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork

查看是否启动成功

ps aux | grep -v grep | grep mongod

shell操作mongo

mongo

初次安装,只有几个默认的数据库

springboot程序查询mongo可以借助MongoRepository或者MongoTemplate
这里的MongoRepository跟spring data jpa很像,由于继承了CrudRepository或者ListCrudRepository和QueryByExampleExecutor所以基本的增删改查操作都可以直接调用方法来实现
如果使用MongoRepository多字段条件查询时可能会很复杂,使用MongoTemplate查询更为方便,这两者的使用得依靠自己来区分哪种方式更为方便
比如一般的分页以及排序查询MongoRepository更为方便一些


而mongoTemplate只能靠mongoTemplate.query()来实现分页的查询

spring data jpa

interface PersonRepository extends Repository<Person, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  // Enabling ignoring case for an individual property
  List<Person> findByLastnameIgnoreCase(String lastname);
  // Enabling ignoring case for all suitable properties
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  // Enabling static ORDER BY for a query
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

解析查询的方法名称分为主语和谓语find…By,exists…By),第二部分形成谓词,可以进一步操作如,find(或其他引入关键字)和By之间的任何文本可认为形容词,除非使用结果限制关键字,如Distinct在要创建的查询上设置不同的标志,如根据用户名去重复(findDistinctByUsername)或者使用Top/First来限制查询结果(findFirstByUsername),排序之后取前3条数据(findTop3ByOrderByCreateTimeDesc)。
Repository中的特殊参数
除了基本类型参数,还可以支持Pageable和 Sort来进行分页和排序

Page<User> findByLastname(String lastname, Pageable pageable);

Slice<User> findByLastname(String lastname, Pageable pageable);

List<User> findByLastname(String lastname, Sort sort);

List<User> findByLastname(String lastname, Pageable pageable);

分页

使用Pageable参数来进行分页,使用sort来排序,因为page分页需要根据总数来进行分页计算,判断总共多少页,是否有下一页等等,如果只想分页,不需要知道总共多少页,可使用slice实现,根据属性hasNext判断是否有下一次分页即可,因为计算总页数需要总条数,使用page来接受会额外花费一次count查询


如果只需要排序,可以在方法参数添加sort,可以使用page也可以使用list接受

在jpa查询中,如果添加了pageable,但是不想分页查询,可以使用Pageable.unpaged(),如果不想使用排序可以使用Sort.unsorted(),如果传入null值会报NPE

排序

定义排序表达式,可以多个条件同时排序

Sort sort = Sort.by("firstname").ascending().and(Sort.by("lastname").descending());

lambda条件表达式

TypedSort<Person> person = Sort.sort(Person.class);
Sort sort = person.by(Person::getFirstname).ascending().and(person.by(Person::getLastname).descending());

条数限制

在find...By中间可以使用其他限制词,比如first或者top关键词来限制查询结果的条数,如果只写first或者top,默认为1条,即findByFirst1 = findByFirst = findByTop

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable);

如果是单条查询,如findFirstByOrderByLastnameAsc可以将返回结果使用Optional来包装避免NPE

Optional<User> findFirstByOrderByLastnameAsc();

常用关键词

关键词 描述
find…By,read…By,get…By,query…By,search…By,stream…By 一般查询方法通常返回存储库类型
exists…By 是否存在,一般返回boolean|
count…By 统计条数|
delete…By,remove…By 删除方法,无返回结果(void)
…First…,…Top 将查询结果限制为结果的第一个。此关键字可以出现在主题的任何地方,介于find(和其他关键字)和by。如前两条findTop2By
…Distinct… 使用不同的查询仅返回唯一的结果介于find(和其他关键字)和by。
posted @ 2023-03-09 20:47  木马不是马  阅读(6)  评论(0编辑  收藏  举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2017 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员