【Mongodb】Mongodb中Repository的语法关键字

本文详细介绍了如何在MongoDb中使用Repository接口结合@Query注解进行复杂查询,包括多条件查询及计数查询,提供了具体代码示例。

参考博客:MongoDb学习(四)–Repository----语法关键字
在这里插入图片描述
除了以上使用固定的字段名来进行操作的方式也可以使用注解来写sql语句,举例如下:

public interface UserRepository extends MongoRepository<A, String> {
	
	// 如果有多个条件时,需要用{$and:[{条件1},{条件2}....]}的形式,否则会报End of file in JSON string. 的异常
	@Query(value="{$and:[{'_id':{$ne:?0},'name':?1,'deletedStatus':?2}]}")
	List<A> getAllA(ObjectId id,String name,boolean deletedStatus);

	// 对于以上的语句如果只是想获取符合条件的数据量,可以使用如下,设置count=true
	@Query(value="{$and:[{'_id':{$ne:?0},'name':?1,'deletedStatus':?2}]}",count=true)
	long countAllA(ObjectId id,String name,boolean deletedStatus);
	
	......
}
<think>我们被要求解释Jongo,并说明它如何通过类SQL语法操作MongoDB,然后提出相关问题。 注意:回答后必须包含“§§相关问题§§”行,并列出3-5个相关问题。 Jongo是一个Java库,它允许使用类似SQL的查询语法(通过字符串)来操作MongoDB,同时利用MongoDB的查询能力。它基于MongoDB的Java驱动,并提供了更简洁的API。 核心特点: 1. 类SQL语法:使用字符串查询,类似于SQL的WHERE子句,但针对MongoDB的文档结构。 2. 参数绑定:支持通过位置或名称绑定参数,避免拼接字符串。 3. 与POJO集成:可以直接将查询结果映射到Java对象(POJO)。 4. 支持聚合框架:可以通过类SQL的方式构建聚合管道。 示例代码: 假设有一个集合“users”,包含文档如:{name:"Alice", age:30, city:"London"} 使用Jongo进行查询: ```java Jongo jongo = new Jongo(mongoDB.getCollection("users")); // 查询年龄大于25的用户 Iterable<User> users = jongo.find("{age: {$gt: #}}", 25).as(User.class); for (User user : users) { System.out.println(user.getName()); } // 使用命名参数 Iterable<User> londonUsers = jongo.find("{city: #city}").bind("city", "London").as(User.class); // 聚合示例:按城市分组并计算平均年龄 AggregateResult<CityAverage> result = jongo.aggregate("{ $group: { _id: '$city', avgAge: { $avg: '$age' } } }").as(CityAverage.class); ``` 优势: - 对于熟悉SQL的开发者更容易上手。 - 减少模板代码,提高开发效率。 缺点: - 需要学习新的查询字符串语法(虽然类似SQL,但针对MongoDB)。 - 可能不如Spring Data MongoDBRepository方式类型安全。 适用场景: - 快速开发,特别是对SQL熟悉的团队。 - 需要动态构建查询的场景(通过字符串拼接)。 注意:Jongo的查询字符串不是真正的SQL,而是MongoDB查询的JSON格式的变种,用#作为占位符。 现在,根据要求,在最后提出3-5个相关问题。</think>**Jongo:使用 MongoDB 的类 SQL 语法** Jongo 是一个开源的 Java 库,它通过类 SQL 的查询语法简化 MongoDB 操作,将传统 SQL 的熟悉感与 MongoDB 的灵活性结合。其核心特性如下: ### 核心功能与语法对比 | **SQL 操作** | **Jongo 语法** | **MongoDB 原生语法** | |---------------------|-----------------------------------|---------------------------------| | `SELECT * FROM users` | `users.find("{}")` | `db.users.find({})` | | `WHERE age > 25` | `users.find("{age: {$gt: #}}", 25)` | `db.users.find({age: {$gt: 25}})` | | `INSERT INTO users VALUES ('Alice', 30)` | `users.insert("{name: 'Alice', age: 30}")` | `db.users.insert({name: 'Alice', age: 30})` | | `UPDATE users SET city='Paris' WHERE name='Alice'` | `users.update("{name: 'Alice'}").with("{$set: {city: 'Paris'}}")` | `db.users.update({name: 'Alice'}, {$set: {city: 'Paris'}})` | ### 关键优势 1. **SQL 式参数化查询** 使用 `#` 占位符防止注入,支持类型安全绑定: ```java users.find("{name: #, age: #}", "Alice", 30); // 等效 SQL: SELECT * WHERE name='Alice' AND age=30 ``` 2. **POJO 无缝映射** 自动将文档转换为 Java 对象: ```java public class User { private String name; private int age; // Getters & Setters } Iterable<User> result = users.find("{age: {$gt: #}}", 25).as(User.class); ``` 3. **聚合管道简化** 用类 SQL 语法构建复杂聚合: ```java users.aggregate("{$match: {age: {$gt: #}}}", 30) .and("{$group: {_id: '$city', total: {$sum: 1}}}") .as(CityCount.class); ``` 4. **嵌入式文档操作** 直接操作嵌套结构: ```java // 查询 address.city 为 London 的用户 users.find("{'address.city': #}", "London"); ``` ### 使用示例 ```java // 初始化 MongoClient client = new MongoClient("localhost"); Jongo jongo = new Jongo(client.getDB("mydb")); MongoCollection users = jongo.getCollection("users"); // 1. 插入数据 users.insert("{name: 'Bob', role: 'admin', last_login: new Date()}"); // 2. 更新数据 users.update("{name: 'Bob'}").with("{$set: {role: 'superadmin'}}"); // 3. 安全查询(防注入) User user = users.findOne("{name: #}", inputName).as(User.class); // 4. 分页排序 Iterable<User> result = users.find("{}") .skip(10).limit(5) .sort("{age: -1}") .as(User.class); ``` ### 适用场景 - 需要快速迁移 SQL 应用到 MongoDB 的项目 - 开发团队熟悉 SQL 但缺乏 MongoDB 经验 - 需要减少样板代码的 CRUD 密集型应用 > **注意**:Jongo 不支持完整 SQL 语法(如 `JOIN`),复杂关联仍需 MongoDB 的 `$lookup` 聚合阶段。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值