整理mango的常用操作以及对应的springmongo template的使用。
1. 根据字段进行查询
db.getCollection('usages').find({"processed":true})
@Component
public class MongoReadWrapper {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 指定field查询
*/
public void specialFieldQuery() {
Query query = new Query(Criteria.where("processed").is(true));
// 查询一条满足条件的数据
Map result = mongoTemplate.findOne(query, Map.class);
System.out.println("query: " + query + " | result: " + result);
// 满足所有条件的数据
List<Map> ans = mongoTemplate.find(query, Map.class);
System.out.println("query: " + query + " | resultALL: " + ans);
}
}
2. and多条件查询
前面是只有一个条件满足,现在如果是要求同时满足多个条件,则利用
org.springframework.data.mongodb.core.query.Criteria#and来斜街多个查询条件
SQL语句:
-- 1.AND条件基本语法
db.collection.find({key1:value1, key2:value2})
-- 例1:查询users集合中年龄为18的女生的所有文档
db.users.find({age: 18, sex: 'girl'})
-- 例2:查询processed是true并且vendor是AWS的所有文档
db.getCollection('usages').find({"processed":true,"vendor":"AWS"})
JAVA实现:
/**
* 多个查询条件同时满足
*/
public void andQuery() {
Query query = new Query(Criteria.where("userName").is("sunyuhua").and("age").is(18));
Map result = mongoTemplate.findOne(query, Map.class);
System.out.println("query: " + query + " | andQuery: " + result);
}
SQL语句:
-- 2.OR条件基本语法
db.collection.find({
$or: [
{key1: value1},
{key2:value2}
]
})
-- 例1:查询users集合中年龄为18或性别为女生的所有文档
db.users.find({
$or: [
{age: 18},
{sex: 'girl'}
]
})
-- 例子2:
db.getCollection('usages').find({$or:[{"processed":true},{"vendor":"AWS"}]})
java实现:
/**
* 或查询
*/
public void orQuery() {
// 等同于 db.getCollection('demo').find({"user": "一灰灰blog", $or: [{ "age": 18}, { "sign": {$exists: true}}]})
Query query = new Query(Criteria.where("user").is("一灰灰blog")
.orOperator(Criteria.where("age").is(18), Criteria.where("sign").exists(true)));
List<Map> result = mongoTemplate.find(query, Map.class);
System.out.println("query: " + query + " | orQuery: " + result);
// 单独的or查询
// 等同于Query: { "$or" : [{ "age" : 18 }, { "sign" : { "$exists" : true } }] }, Fields: { }, Sort: { }
query = new Query(new Criteria().orOperator(Criteria.where("age").is(18), Criteria.where("sign").exists(true)));
result = mongoTemplate.find(query, Map.class);
System.out.println("query: " + query + " | orQuery: " + result);
}
4. in查询
SQL查询
db_name.collection_name.find({filed:{$in:[val1, val2]}});
-- 例子1
db.getCollection('usages').find({"_id":{$in:["ab0018c046f2f4a6b72abb4ad2fe4873","a8896c877a899a634b6d4c6a113d5032"]}})
java实现:
/**
* in查询
*/
public void inQuery() {
// 相当于:
Query query = new Query(Criteria.where("age").in(Arrays.asList(18, 20, 30)));
List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);
System.out.println("query: " + query + " | inQuery: " + result);
}
5. 数值比较
数值的比较大小,主要使用的是 get, gt, lt, let
SQL实现:
db_name.collection_name.find({ <field>: { $gte: val } });
--例子1:查询startTime大于等于2021-09-04T07:58:40.000Z的所有文档
db.getCollection('usages').find({"startTime":{$gte:{
"dateTime" : ISODate("2021-09-04T07:58:40.000Z"),
"offset" : "Z"
}}})
JAVA实现
/**
* 数字类型,比较查询 >
*/
public void compareBigQuery() {
// age > 18
Query query = new Query(Criteria.where("age").gt(18));
List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);
System.out.println("query: " + query + " | compareBigQuery: " + result);
// age >= 18
query = new Query(Criteria.where("age").gte(18));
result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);
System.out.println("query: " + query + " | compareBigQuery: " + result);
}
SQL实现:
JAVA实现:
/**
* 数字类型,比较查询 <
*/
public void compareSmallQuery() {
// age < 20
Query query = new Query(Criteria.where("age").lt(20));
List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);
System.out.println("query: " + query + " | compareSmallQuery: " + result);
// age <= 20
query = new Query(Criteria.where("age").lte(20));
result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);
System.out.println("query: " + query + " | compareSmallQuery: " + result);
}
7. 查询总数
SQL查询:
db.getCollection('usages').find({"processed":true}).count()
JAVA实现:
统计常用,这个主要利用的是mongoTemplate.count方法
/**
* 查询总数
*/
public void countQuery() {
Query query = new Query(Criteria.where("user").is("一灰灰blog"));
long cnt = mongoTemplate.count(query, COLLECTION_NAME);
System.out.println("query: " + query + " | cnt " + cnt);
}
8.分组查询
{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }
/*
* 分组查询
*/
public void groupQuery() {
// 根据用户名进行分组统计,每个用户名对应的数量
// aggregate([ { "$group" : { "_id" : "user" , "userCount" : { "$sum" : 1}}}] )
Aggregation aggregation = Aggregation.newAggregation(Aggregation.group("user").count().as("userCount"));
AggregationResults<Map> ans = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
System.out.println("query: " + aggregation + " | groupQuery " + ans.getMappedResults());
}
9. 排序
SQL实现:
db.getCollection('usages').find({"size":{ $lt: "2.4" }}).sort("_id":1)
JAVA实现:
/**
* 排序查询
*/
public void sortQuery() {
// sort查询条件,需要用with来衔接
Query query = Query.query(Criteria.where("user").is("一灰灰blog")).with(Sort.by("age"));
List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);
System.out.println("query: " + query + " | sortQuery " + result);
}
10. 分页
SQL实现:
-- 使用语法(limit()、skip()、sort()方法可以组合使用)
db.collectionName.find().limit(NUMBER)
db.collectionName.find().skip(NUMBER)
db.collectionName.find().sort({"key": 1/-1})
-- 例1:跳过前50条数据查询users集合中姓名字段为字符串类型的100之内的数据
db.users.find({"name" : {$type : 2}}).limit(100).skip(50)
-- 例2:将查询到users集合中姓名字段为字符串类型的文档数据按升序排列
db.users.find({"name" : {$type : 2}}).sort({"name": 1})
JAVA实现:
/**
* 分页查询
*/
public void pageQuery() {
// limit限定查询2条
Query query = Query.query(Criteria.where("user").is("一灰灰blog")).with(Sort.by("age")).limit(2);
List<Map> result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);
System.out.println("query: " + query + " | limitPageQuery " + result);
// skip()方法来跳过指定数量的数据
query = Query.query(Criteria.where("user").is("一灰灰blog")).with(Sort.by("age")).skip(2);
result = mongoTemplate.find(query, Map.class, COLLECTION_NAME);
System.out.println("query: " + query + " | skipPageQuery " + result);
}
参考链接:
https://juejin.cn/post/6844903760477569031
https://haicoder.net/mongodb/mongodb-find-le.html
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/sunyuhua_keyboard/article/details/124215299
内容来源于网络,如有侵权,请联系作者删除!