Spring Data MongoDB查询指南.docx
- 文档编号:7970245
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:12
- 大小:115.50KB
Spring Data MongoDB查询指南.docx
《Spring Data MongoDB查询指南.docx》由会员分享,可在线阅读,更多相关《Spring Data MongoDB查询指南.docx(12页珍藏版)》请在冰豆网上搜索。
SpringDataMongoDB查询指南
SpringDataMongoDB查询指南
SpringDataMongoDB中的查询指南
1.概述
本文将关注在SpringDataMongoDB中构建不同类型的查询。
我们将查看使用Query和Criteria类查询ducument、自动生成的查询方法、JSON查询和
QueryDSL。
1.1.Maven依赖
如果你希望使用SpringDataMongoDB,你需要加入以下条目到你的pom.xml文件:
最新版本可以在这里找到。
2.Document查询
使用SpringData查询MongoDB的一种常见方法是使用Query和Criteria类,它们非常接近原生操作。
2.1.is
这只是一个使用相等的criterion,让我们看看它是如何工作的。
在以下示例中,我们查找名为Eric的用户。
让我来看看我们的数据库:
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric",
"age":
45
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony","age":
55
}
]
现在让我们看一下查询代码:
Queryquery=newQuery();query.addCriteria(Criteria.where("name").is("Eric"));List
该逻辑的返回值将如预期:
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
}
2.2.正则表达式
正则表达式是一种更灵活、更强大的查询类型。
这将使用MongoDB$regex创建一个返回对应字段符合该正则表达式的所有记录的criterion。
它的工作方式类似于startingWith、endingWith操作,让我们查看一个例子。
我们现在正在查找name以A开头的所有用户。
这里是数据库的状态:
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony","age":
33
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581909"),"_class":
"org.baeldung.model.User",
"name":
"Alice","age":
35
}
]
现在让我们创建查询:
Queryquery=newQuery();query.addCriteria(Criteria.where("name").regex("^A"));List
运行,将返回两条记录:
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony","age":
33
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581909"),"_class":
"org.baeldung.model.User",
"name":
"Alice","age":
35
}
]
这里是另一个快速示例,这次查找name以c结尾的所有用户:
Queryquery=newQuery();query.addCriteria(Criteria.where("name").regex("c$"));List
结果将是:
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
}
2.3.lt和gt
这些运算符创建使用$lt(小于)运算符和$gt(大于)运算符的criterion。
让我们快速看一个例子,我们正在查找age在20到50之间的所有用户。
数据库为:
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony","age":
55
}
]
查询代码为:
Queryquery=newQuery();query.addCriteria(Criteria.where("age").lt(50).gt(20));List
结果为age大于20小于50的所有用户:
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
}
2.4.sort
sort被用于指定结果的排序顺序。
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony","age":
33
},
{
以下示例返回按age升序排列的所有用户。
首先,这里是已有数据:
"_id":
ObjectId("55c0e5e5511f0a164a581909"),"_class":
"org.baeldung.model.User",
"name":
"Alice","age":
35
}
]
然后执行sort:
Queryquery=newQuery();
query.with(newSort(Sort.Direction.ASC,"age"));List
这是查询结果,漂亮的按age排序:
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony","age":
33
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581909"),"_class":
"org.baeldung.model.User",
"name":
"Alice","age":
35
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
}
]
2.5.pageable
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony",
让我们查看一个使用分页的快速示例。
这里是数据库状态:
"age":
33
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581909"),"_class":
"org.baeldung.model.User",
"name":
"Alice","age":
35
}
]
现在,查询逻辑将简单的请求一个大小为2的页面:
finalPageablepageableRequest=newPageRequest(0,2);Queryquery=newQuery();query.with(pageableRequest);
结果是如预期的2个document:
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581907"),"_class":
"org.baeldung.model.User",
"name":
"Eric","age":
45
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony","age":
33
}
]
3.已生成的查询方法
publicinterfaceUserRepository
extendsMongoRepository
...
}
让我们探讨一下SpringData通常提供的更常见的查询类型,自动生成的查询方法名称。
问哦们唯一需要做的就是利用这些类型的查询在repository接口上声明方法:
3.1.findByX
我们将开始简单的通过探讨findBy类型的查询,在这种情况下,按name查找:
List
与之前2.1节中的一样,查询将具有相同的结果,查找具有给定name的所有用户:
List
3.2.startingWith和endingWith
在2.2中,我们探讨了基于正则表达式的查询。
starts和ends当然没那么强大,但是非常有用,特别是如果我们不必实际实现它们。
这里是一个操作如何展示的快速示例:
List
当然,实际使用它的例子非常简单:
List
结果完全一样。
3.3.between
和2.3类似,这将返回age在ageGT和ageLT之间的所有用户:
List
调用方法将导致找到完全相同的document:
List
3.4.like和orderBy
这次让我们查看更高级的示例,为生成的查询组合两种修饰符。
我们将要查找name包含字母A的所有用户,并且我们还按age升序排列结果:
List
对于我们在2.4中使用的数据库,结果将是:
[
{
"_id":
ObjectId("55c0e5e5511f0a164a581908"),"_class":
"org.baeldung.model.User",
"name":
"Antony",
"age":
33
},
{
"_id":
ObjectId("55c0e5e5511f0a164a581909"),"_class":
"org.baeldung.model.User",
"name":
"Alice","age":
35
}
]
4.JSON查询方法
如果我们不能在方法名或criteria的帮助下表示查询,我们可以做更低级的事情,使用@Query注解。
使用此注解,我们可以指定原始查询,作为MongoJSON查询字符串。
4.1.findBy
首先让我们开始简单查看我们将如何表示一个findby类型的方法:
@Query("{'name':
?
0}")
List
此方法应按name返回用户,占位符?
0引用方法的第一个参数。
List
4.2.$regex
让我们看看正则表示是驱动的查询,当然,将产生和2.2以及3.2相同的结果:
@Query("{'name':
{$regex:
?
0}}")List
用法也完全相同:
List
4.3.$lt和$gt
现在让我们实现lt和gt查询:
@Query("{'age':
{$gt:
?
0,$lt:
?
1}}")
List
然而现在该方法有2个参数,我们通过原始查询中的?
0和?
1索引引用每个参数。
List
5.QueryDSL查询
MongoRepository对QueryDSL项目有很好的支持,所以我们可以利用这个不错的、类型安全的
API。
5.1.Maven依赖
首先,让我们确保我们在pom中定义了正确的依赖:
5.2.Q-classes
QueryDSL使用Q-classes创建查询。
但是,由于我们并不希望手动创建这些,我们需要以某种方式生成它们。
我们将使用apt-maven-plugin来做到这一点:
让我们查看User类,特别关注@QueryEntity注解:
@QueryEntity@Document
publicclassUser{
@Id
privateStringid;privateStringname;privateIntegerage;
//standardgettersandsetters
}
在运行Maven生命周期的process目标(或在这之后的任何其他目标)后,apt插件在
target/generated-sources/java/{yourpackagestructure}下将生成新类:
/**
*QUserisaQuerydslquerytypeforUser
*/@Generated("com.mysema.query.codegen.EntitySerializer")publicclassQUserextendsEntityPathBase
privatestaticfinallongserialVersionUID=...;publicstaticfinalQUseruser=newQUser("user");
publicfinalNumberPath
publicfinalStringPathname=createString("name");
publicQUser(Stringvariable){super(User.class,forVariable(variable));
}
publicQUser(Path
extendsUser>path){super(path.getType(),path.getMetadata());
}
publicQUser(PathMetadata
>metadata){super(User.class,metadata);
}
}
在这个类的帮助下,我们不用再创建我们的查询。
稍微说一下,如果你正在使用Eclipse,引入此插件将在pom生成以下警告:
YouneedtorunbuildwithJDKorhavetools.jarontheclasspath.IfthisoccursduringeclipsebuildmakesureyouruneclipseunderJDKaswell(com.mysema.maven:
apt-maven-plugin:
1.1.3:
process:
default:
generate-sources
...
-vm
{path_to_jdk}\jdk{your_version}\bin\javaw.exe
Maveninstall工作正常并且生成了QUser类,但是插件在pom中高亮显示。
快速解决方案是在eclipse.ini中手动指定JDK:
5.3.新的repository
现在我们需要在我们的repositories中实际启用QueryDSL支持,这可以简单的通过继承
QueryDslPredicateExecutor接口来完成:
publicinterfaceUserRepositoryextends
MongoRepository
5.4.eq
QUserqUser=newQUser("user");
Predicatepredicate=qUser.name.eq("Eric");
List
支持启用后,现在让我们实现与之前举例相同的查询。
我们将从简单的相等开始:
5.5.startingWith和endingWith
同样,让我们实现之前的查询,并找到name以A开头的所有用户:
QUserqUser=newQUser("u
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring Data MongoDB查询指南 MongoDB 查询 指南