• MongoDB应用实战


    MongoDB应用实战

    MongoDB的适用场景

    • 网站数据:Mongo非常适合实时的插入、更新和查询,并具备网站实时数据存储所需的复制及高度伸缩性
    • 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载
    • 大尺寸、低价值的数据:使用传统的关系型数据库存储一些大尺寸低价值的数据时会比较浪费。
    • 高伸缩性的场景:MongoDB非常适合由数十或数百服务器组成的数据库,Mongo的路线图中已经包含对MapReduce引擎的内置支持以及集群高可用的解决方案
    • 用于对象及JSON数据的存储:Mongo的BSON数据格式也非常适合文档化格式的存储及查询

    MongoDB的行业场景

    • 游戏场景:使用MongoDB存储游戏用户信息、用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新。
    • 物流场景:使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来
    • 社交场景:使用MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
    • 物联网场景:使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
    • 直播场景:使用MongoDB存储用户信息、礼物信息等

    也可以根据下面这个表判断能否使用MongoDB:

    应用特性 Yes/No
    应用不需要事务及复杂join支持
    新应用,需求会变,数据模型无法确定,想快速迭代开发
    应用需要TB甚至 PB 级别数据存储
    应用发展迅速,需要能快速水平扩展
    应用要求存储的数据不丢失
    应用需要99.999%高可用
    应用需要大量的地理位置查询、文本查询

    如果以上条件满足,那么就可以使用MongoDB。

    MongoDB Java客户端

    下面将介绍三种方式连接MongoDB。分别是:MogoClient、MongoTemplate、MongoRepository。

    1. MongoClient

    引入依赖

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.10.1</version>
    </dependency>
    

    文档添加

    public static void add(){
            MongoClient mongoClient=new MongoClient("192.168.56.115",27017);
            MongoDatabase database = mongoClient.getDatabase("test");
            MongoCollection<Document> collection = database.getCollection("user");
            Document document=Document.parse("{name:'lisi',city:'bj',birth_day:new ISODate('2001-08-01'),expectSalary:18000}");
            collection.insertOne(document);
            mongoClient.close();
        }
    

    文档查询

    public static void query(){
            MongoClient mongoClient=new MongoClient("192.168.56.115",27017);
            MongoDatabase database = mongoClient.getDatabase("test");
            MongoCollection<Document> collection = database.getCollection("user");
            Document sortDocument=new Document();
            sortDocument.append("expectSalary",1);
            FindIterable<Document> documents = collection.find().sort(sortDocument);
            for (Document document:documents){
                System.out.println(document);
            }
            mongoClient.close();
        }
    
        public static void query2(){
            MongoClient mongoClient=new MongoClient("192.168.56.115",27017);
            MongoDatabase database = mongoClient.getDatabase("test");
            MongoCollection<Document> collection = database.getCollection("user");
            FindIterable<Document> documents = collection.find(Filters.gt("expectSalary", 21000));
            for (Document document:documents){
                System.out.println(document);
            }
            mongoClient.close();
        }
    

    2. MongoTemplate

    2.1 在Spring应用里配置如下:

    引入依赖:

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>2.0.9.RELEASE</version>
    </dependency>
    

    注入Spring Bean

    <!-- 构建MongoDb工厂对象 -->
      <mongo:db-factory id="mongoDbFactory"
        client-uri="mongodb://192.168.211.133:37017/lg_resume">
      </mongo:db-factory>
      <!-- 构建 MongoTemplate 类型的对象 -->
      <bean id="mongoTemplate"
    class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg index="0" ref="mongoDbFactory"></constructor-arg>
      </bean>
    

    2.2 Spring Boot里配置如下:

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.2.2.RELEASE</version>
    </dependency>
    

    配置文件:

    spring.data.mongodb.host=192.168.56.115
    spring.data.mongodb.port=27017
    spring.data.mongodb.database=test
    

    开始使用mongoTemplate

    @Repository
    public class UserDaoImpl implements UserDao{
    
        @Autowired
        private MongoTemplate mongoTemplate;
    
        @Override
        public  List<User> getUser(String name) {
            Query query=new Query();
            query.addCriteria(Criteria.where("name").is(name));
            List<User> users = mongoTemplate.find(query, User.class, "user");
            return users;
        }
    
        @Override
        public User addUser(User user) {
            User result = mongoTemplate.insert(user);
            return result;
        }
    
        @Override
        public List<User> getUser(String name, Double expectSalary) {
            Query query=new Query();
            query.addCriteria(Criteria.where("name").is(name).andOperator(Criteria.where("expectSalary").gt(expectSalary)));
            return mongoTemplate.find(query,User.class);
        }
    
        @Override
        public void updateUser(String name, Double expectSalary) {
            Query query=new Query();
            query.addCriteria(Criteria.where("name").is(name));
            Update update=new Update();
            update.set("expectSalary",expectSalary);
            mongoTemplate.updateFirst(query,update,User.class);
        }
    
        @Override
        public void deleteUser(String name) {
            mongoTemplate.remove(Query.query(Criteria.where("name").is(name)),User.class);
        }
    }
    

    3. MongoRepository

    3.1 引入依赖

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.2.2.RELEASE</version>
    </dependency>
    

    3.2 配置文件:

    spring.data.mongodb.host=192.168.56.115
    spring.data.mongodb.port=27017
    spring.data.mongodb.database=test
    

    3.3 编写实体类,并加上@Document("集合名")

    3.4 编写Repository接口,继承MongoRepository

    public interface UserRepository extends MongoRepository<User, String> {
    
        List<User> findByName(String username);
    
        List<User> findByNameAndExpectSalaryGreaterThan(String username, Double expectSalary);
    
        void deleteByName(String username);
    }
    

    3.5 使用Repository

    @Repository
    public class UserDaoImpl2 implements UserDao{
    
    
        @Autowired
        private UserRepository userRepository;
    
        @Override
        public  List<User> getUser(String name) {
            List<User> users = userRepository.findByName(name);
            return users;
        }
    
        @Override
        public User addUser(User user) {
            User result = userRepository.save(user);
            return result;
        }
    
        @Override
        public List<User> getUser(String name, Double expectSalary) {
            List<User> users = userRepository.findByNameAndExpectSalaryGreaterThan(name, expectSalary);
            return users;
        }
    
        @Override
        public void updateUser(String name, Double expectSalary) {
            User user=new User();
            user.setName(name);
            user.setExpectSalary(expectSalary);
            userRepository.save(user);
        }
    
        @Override
        public void deleteUser(String name) {
           userRepository.deleteByName(name);
        }
    }
    
  • 相关阅读:
    使用用Ghost制作的win2k3和winxp文件具有相同的SID的解决办法
    64 bits Windows 7 使用 regsvr32 的註冊方式(转)
    怎么实现用户匿名访问web,但数据库要用Windows集成验证方式(数据库和web服务器分别在两台机器上)
    为什么按照微软给定的匿名配置Web 同步最终造成创建订阅的步骤总是失败?但改为需要身份验证就行了
    How to edit Team Build Types
    利用WhiteHose一步步建立分布式系统的框架(二)创建LDD步骤
    发现:InfoPath 2007 Training Labs地址
    在MSF中怎么区分易混淆的工作项类型:Bug、风险和问题(我个人的理解)
    RGB Colour Map
    How to distinguish Design time or Running time in Mobile cusotmer Contorl(the NetCF2.0 is different to NetCF1.0)
  • 原文地址:https://www.cnblogs.com/javammc/p/16485991.html
Copyright © 2020-2023  润新知