前言
Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,本文章是mongodb的原生查询语法和spring的MongoTemplate对比讲解的.所用对Mongodb原生的增删改查要有一定的了解
数据库结构( User 集合样例)
{
"_id" : "5a0e6d48498eac55eb8bf0a4",
"nickname":"轩哥",
"name":"水车",
"age":20,
"work":"programmer"
"girlfriend":{
name:"如花",
age:40,
work:"noJob"
},
"boyfriend"[
{
name:"狗蛋",
age:18,
Intimacy:99
},
{
name:"麻子",
age:21,
Intimacy:88
}
],
playGame:["dnf","英雄联盟","绝地求生"]
},
......
我们会对类似以上的集合进行查询
查询
本地创建好类似的model,我定义的model叫MongoUser.java
query查询语句的实现的方式有两种:
方法一: org.springframework.data.mongodb.core.query
语法:
Query (Criteria criteria) // (构造函数)
接受的参数是org.springframework.data.mongodb.core.query.Criteria
Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将多个方法标准和查询连接起来
示例1: 查询名字叫”水车”的 一条 信息
如果是多条信息,用find(),但是用find的时候返回的是一个集合,所以在JAVA中就不能用对象去接了,而是要用List(数组)
#mongodb语法
db.User.findOne({"name":"水车"})
#java写法1
Query query = new Query();
query.addCriteria(new Criteria("name").is("水车"));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
#java写法2
Query query = new Query();
query.addCriteria(Criteria.where("name").is("水车"));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
#java写法3
Query query = new Query(Criteria.where("name").is("水车"));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
示例2: 查询名字叫”水车”的,并且年龄是20岁的 一条 信息
如果是多条信息,用find()
#mongodb语法
db.User.findOne({"name":"水车","age":20})
#java写法1
Query query = new Query();
query.addCriteria(new Criteria("name").is("水车"));
query.addCriteria(new Criteria("age").is(20));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
#java写法2
Query query = new Query();
query.addCriteria(Criteria.where("name").is("水车").and("age").is(20));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
#java写法3
Query query = new Query(Criteria.where("name").is("水车").and("age").is(20));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
示例3: 查询名字叫”水车”的或者是绰号叫”轩哥”的 一条 信息
如果是多条信息,用find()
#mongodb语法
db.User.findOne({"$or":[{"name":"水车"},{"nickname":"轩哥"}]})
#java写法
Query query = new Query();
query.addCriteria(new Criteria().orOperator(Criteria.where("name").is("水车"), Criteria.where("nickname").is("轩哥")));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
示例4: 查询名字叫”水车”的年龄是20的 或者 是绰号叫”轩哥”的,年龄是20的 一条 信息
如果是多条信息,用find()
#mongodb语法
db.User.findOne({"$or":[{"name":"水车","age":20},{"nickname":"轩哥","age":20}]})
#java写法
//orOperator(参数1, 参数2, ...)
Query query = new Query();
query.addCriteria(new Criteria().orOperator(Criteria.where("name").is("水车").and("age").is(20), Criteria.where("nickname").is("轩哥").and("age").is(20)));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
示例5: 查询名字叫”水车”的或者叫”张三”的或者叫”李四”的或者叫”王麻子的” 信息
#mongodb语法
db.User.find({"name":{"$in":["水车","张三","李四","王麻子"]})
#java写法1
Query query = new Query();
String[] nameStr = {"水车","张三","李四","王麻子"}
query.addCriteria(new Criteria("name").in(nameStr));
List<MongoUser> user = this.mongoTemplate.findOne(query, MongoUser.class);
#java写法2
Query query = new Query();
String[] nameStr = {"水车","张三","李四","王麻子"}
query.addCriteria(Criteria.where("name").in(nameStr));
List<MongoUser> user = this.mongoTemplate.findOne(query, MongoUser.class);
示例6: 查询 年龄大于20岁 小于30岁的人 信息
#mongodb语法
db.User.find({"age":{"$gt":20,"$lt":30]})
#java写法
Query query = new Query();
query.addCriteria(Criteria.where("age").gt(20).lt(30);
List<MongoUser> user = this.mongoTemplate.findOne(query, MongoUser.class);
简单示例就到此为止下面是列出的Criteria可以接的一些方法和对应的mongodb方法
Criteria | Mongodb | 说明 | 备注 |
---|---|---|---|
Criteria and (String key) | $and | 并且 | |
Criteria andOperator (Criteria… criteria) | $and | 并且 | |
Criteria orOperator (Criteria… criteria) | $or | 或者 | |
Criteria gt (Object o) | $gt | 大于 | |
Criteria gte (Object o) | $gte | 大于等于 | |
Criteria in (Object… o) | $in | 包含 | 可以是一个数组 |
Criteria is (Object o) | $is | 等于 | |
Criteria lt (Object o) | $lt | 小于 | |
Criteria lte (Object o) | $lte | 小等于 | |
Criteria nin (Object… o) | $nin | 不包含 | 可以是一个数组 |
稍复杂的查询
示例7: 查询 女朋友的name叫如花的一条信息
#mongodb语法
db.User.findOne({"girlfriend.name":"如花")
#java写法
Query query = new Query();
query.addCriteria(Criteria.where("girlfriend.$.name").is("如花");
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
示例8: 查询 name中包含”轩” 这一个字的 多条信息 –模糊查询
#mongodb语法
...
new Query(),
#java写法
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("轩");
List<MongoUser> user = this.mongoTemplate.findOne(query, MongoUser.class);
示例9: 查询 数组中数量是3的信息 –模糊查询
#mongodb语法
...
new Query(),
#java写法
Query query = new Query();
query.addCriteria(Criteria.where("boyfriend").size(3);
ListMongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);
方法二: org.springframework.data.mongodb.core.query.BasicQuery
持续更新中…