首页 > 其他分享 >mongo操作工具类(索引创建等)

mongo操作工具类(索引创建等)

时间:2022-10-05 11:00:58浏览次数:44  
标签:mongo 创建 void 索引 new Date import public name

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.ft.monitoring.management.OnlineApplication;
import com.mongodb.BasicDBObject;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.IndexModel;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.result.DeleteResult;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * mongo数据库工具类
 */
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = OnlineApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("my")
@Rollback(value = false)
public class MongoUtil {

    private MongoTemplate mongoTemplate;

    /**
     * 创建查询索引
     */
    @Test
    public void createIndex(){
        List<IndexModel> indexModels = new ArrayList<>();
        //组合索引
        BasicDBObject index1 = new BasicDBObject();
        //"name"->索引列  1/-1 正序/倒序
        index1.put("name",1);
        index1.put("age",1);
        index1.put("birthday",-1);
        //添加配置
        IndexOptions indexOptions = new IndexOptions();
        indexOptions.background(true);
        //索引名称
        indexOptions.name("name_age_birthday");
        indexModels.add(new IndexModel(index1,indexOptions));
        System.err.println("name_age_birthday 开始创建索引");
        mongoTemplate.getCollection("user_info").createIndexes(indexModels);
    }

    /**
     * 创建失效索引
     */
    @Test
    public void mongoCreateExpireIndex(){
        List<IndexModel> indexModels = new ArrayList<>();
        //组合索引
        BasicDBObject index1 = new BasicDBObject();
        //失效列
        index1.put("updateTime",1);
        //添加配置
        IndexOptions indexOptions = new IndexOptions();
        indexOptions.background(true);
        indexOptions.name("expireIndex_updateTime");
        //失效时间->超过(当前时间-(365*24*60*60)秒)的作为失效数据自动删除
        indexOptions.expireAfter(31536000l, TimeUnit.SECONDS);
        indexModels.add(new IndexModel(index1,indexOptions));
        System.err.println("expireIndex_updateTime 开始创建失效索引");
        mongoTemplate.getCollection("base_data_test").createIndexes(indexModels);
    }

    /**
     * 查询方法1->使用封装的进行查询
     * 当数据量很多时,查询结果转为UserInfo耗时很高,可能会导致内存崩溃
     */
    @Test
    public void mongoSearch1(){
        System.err.println("==========开始->\t"+ DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss.sss"));
        //根据索引查询
        Criteria criteria1 = Criteria.where("name").is("张三");
        criteria1.and("age").is(18);
        criteria1.and("birthday").lte(dateToISODate(DateUtil.parse("2022-01-01 00:00:00","yyyy-MM-dd HH:mm:ss")))
                .gte(dateToISODate(DateUtil.parse("2021-01-01 00:00:00","yyyy-MM-dd HH:mm:ss")));
        Query query1 = new Query();
        query1.addCriteria(criteria1);
        List<UserInfo> list1 = mongoTemplate.find(query1,UserInfo.class,"user_info");
        System.err.println("==========结束->\t"+ DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss.sss"));
        System.err.println("数量"+list1.size());
    }

    /**
     * 原生document查询
     * 查询mongo原生的文档,类似json对象的使用方法,在数据量多的情况下,可以减少内存消耗
     */
    @Test
    public void mongoSearch2(){
        System.err.println("==========开始->\t"+ DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss.sss"));
        List<Bson> filterList = new ArrayList<>();
        filterList.add(Filters.in("name","张三"));
        filterList.add(Filters.eq("age",18));
        filterList.add(Filters.gte("birthday",dateToISODate(DateUtil.parse("2022-06-28 17:07:44","yyyy-MM-dd HH:mm:ss"))));
        filterList.add(Filters.lte("birthday",dateToISODate(DateUtil.parse("2022-06-28 17:07:44","yyyy-MM-dd HH:mm:ss"))));
        FindIterable<Document> documentFindIterable = mongoTemplate.getCollection("user_info").find(Filters.and(filterList));
        MongoCursor<Document> cursor = documentFindIterable.iterator();
        while (cursor.hasNext()){
            Document document = cursor.next();
            System.err.println(JSON.toJSONString(document));
        }
    }

    /**
     * 删除数据
     */
    @Test
    public void deleteTest(){
        DeleteResult result = mongoTemplate.remove(new Query(Criteria.where("name").is("张三")), "user_info");
        System.err.println("删除数据数量为:"+result.getDeletedCount());
    }


    public Date dateToISODate(Date dateStr){
        Date strToDate = null;
        try{
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
            strToDate = sdf.parse(sdf.format(dateStr));
        }catch (Exception e){
            e.printStackTrace();
        }
        return strToDate;
    }

    /**
     * 用户信息
     */
    class UserInfo{
        private String name;
        private Integer age;
        private String address;
        private Date birthday;
        private Date createTime;
        private Date updateTime;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public Date getBirthday() {
            return birthday;
        }

        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }

        public Date getCreateTime() {
            return createTime;
        }

        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }

        public Date getUpdateTime() {
            return updateTime;
        }

        public void setUpdateTime(Date updateTime) {
            this.updateTime = updateTime;
        }
    }
}

 

标签:mongo,创建,void,索引,new,Date,import,public,name
From: https://www.cnblogs.com/Sora-L/p/16755218.html

相关文章

  • 创建临时表
    关于创建全局临时表全局临时表的元数据对多个用户及其会话可见,但其内容是会话本地的。例如,假设基于Web的航空公司预订应用程序允许客户创建多个可选行程。每个行程都由......
  • 手动创建kafka生产者,消费者
    pom.xml<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><exclusions>......
  • 手动创建mongo连接
    通过读取配置手动创建mongo连接对象一、配置实体importcom.alibaba.druid.util.StringUtils;importcom.ft.monitoring.dataInterface.common.util.Md5Util;importc......
  • MySQL/MariaDB如何创建用户并限制指定才能IP访问?
    MySQL/MariaDB如何创建用户并限制指定才能IP访问?登入数据$mysql--versionmysqlVer15.1Distrib10.9.3-MariaDB,fordebian-linux-gnu(x86_64)usingreadline......
  • Elastic搜索引擎8.4+最新记录
    ********一、新增*******添加数据/索引(index数据库)/类型(type表)/文档(document记录)POST/test/_doc/1{"name":"刘备","age":27,"desc":"有志者事竟成"}P......
  • 性能测试中数据库索引和MySQL数据库慢SQL问题的定位和分析【杭州多测师】【杭州多测师
    数据库性能问题:TPS很低、响应时间比较长然后数据库服务器的CPU特别搞接近100%、但是应用服务器的负载比较低索引:是MySQL数据库中一列或者多列的值进行排序的结构、使用索......
  • 【学习笔记】索引
    索引mysql官方对索引的定义为:索引(index)是帮助Mysql高效获取数据的数据结构,提取句子主干,就可以得到索引的本质:索引是数据结构。 索引的分类主键索引(PRIMARYKEY)......
  • Mysql索引
    是什么在MySQL进行查询时,需要将全部数据加载到内存之中,然后以页的形式进行遍历查询,这样的查询效率太低,于是有了索引这个概念,索引类似于目录,将数据关键字整理为索引,通过索......
  • 索引组织表
    索引组织表的存储组织是主B树的变体。与数据存储为无序集合(堆)的普通(堆组织)表不同,索引组织表的数据以主键排序的方式存储在B树索引结构中。索引结构中的每个叶块都存储键列......
  • 一文读懂 MongoDB 和 MySQL 的差异
    下面讨论MongoDB和MySQL在各种参数上的差异:什么是MongoDB和MySQL?MongoDBMySQLMongoDB是由MongoDB,Inc.开发的开源数据库。MongoDB将数据存储在类似JSON的文档中,这......