mango的常用操作和spring mongoTemplate的使用

x33g5p2x  于2022-04-17 转载在 Spring  
字(6.6k)|赞(0)|评价(0)|浏览(261)

整理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

相关文章