zoukankan      html  css  js  c++  java
  • 4.0.3的mongodb 安装和java使用

    一 整合

    由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面。

    附上自己的github项目地址 https://github.com/247292980/spring-boot

    附上汇总博文地址 https://www.cnblogs.com/ydymz/p/9391653.html

    以整合功能

    spring-boot,FusionChart,thymeleaf,vue,ShardingJdbc,mybatis-generator,微信分享授权,drools,spring-security,spring-jpa,webjars,Aspect,drools-drt,rabbitmq,zookeeper

    这次就来整合下简单的mongodb 安装和java使用

    二 安装

    基于菜鸟 http://www.runoob.com/mongodb/mongodb-tutorial.html

    1.官网安装,没什么好说的新手msi直接一路点下去,老手解压安装,那就更不用说了...

    2.环境变量设置,这部很多教程不写,其实多个这玩意cmd用起来很舒服的

    3.创建数据目录,data文件夹,conf文件夹,db文件夹,log文件夹

    4.创建配置文件mongod.cfg和日志文件。配置文件自己修改成相应的地址

    systemLog:
        destination: file
        path: D:mongodb-4.0.3datalogmongod.log
    storage:
        dbPath: D:mongodb-4.0.3datadb

     

    5.安装成服务

    mongod --config "D:mongodb-4.0.3confmongod.cfg" --install

    6.启动服务

    net start MongoDB
    
    ps.
    net stop MongoDB 停止服务
    
    mongod --remove 卸载服务

     

     三 使用

    1.启动后台shell,

    mongo

     第一次是这样的,他提示你要加个密码

     

    2.选择admin数据库

    use admin

    3.创建用户

    db.createUser( { 
    user: "admin", //用户名 
    pwd: "123456", //密码 
    roles: [ { role: "root", db: "admin" } ] //权限
     } )

    ps.

    user文档字段介绍:
        user字段,为新用户的名字;
        pwd字段,用户的密码;
        cusomData字段,为任意内容,例如可以为用户全名介绍;
        roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色;
    
    Built-In Roles(内置角色):
        1. 数据库用户角色:read、readWrite;
        2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
        3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
        4. 备份恢复角色:backup、restore;
        5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
        6. 超级用户角色:root  
        // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
        7. 内部角色:__system

    3.卸载服务,重装再启动,注意--auth

    mongod --auth --config "D:mongodb-4.0.3confmongod.cfg" --install
    net start MongoDB
    
    net stop MongoDB 停止服务
    
    mongod --remove 卸载服务

    此时启动mongo不使用密码登录则看起来成功进入

    实际

    4.正确的启动

    mongo --port 27017 -u "admin" -p "123456" --authenticationDatabase "admin"

    四 语法

    有兴趣的建议直接菜鸟找吧,了解一下即可

    五 java使用

    官方api我喜欢这样的官方! http://mongodb.github.io/mongo-java-driver/3.7/javadoc/

    坑点一

    百度上大多数教程只给了代码,但是依然不成功,因为少导了包,导致java.lang.NoClassDefFoundError: com/mongodb/DBObject

    pom.xml

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>mongodb-driver</artifactId>
                <version>3.8.2</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-core -->
            <dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>mongodb-driver-core</artifactId>
                <version>3.8.2</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.mongodb/bson -->
            <dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>bson</artifactId>
                <version>3.8.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>

    坑点二

    哪怕你绕开的包的坑,你还会进入一个权限验证的坑,主要是因为百度上的版本太低了,需要修改一下校验的版本...而我是直接从官网高最新版本的,这个bug就修复了。但是,配置方面有些许不兼容。例如,mongodb和spring-mongodb默认的认证机制不同。

    1、mongodb的认证机制有2种:SCRAM-SHA-1和MONGODB-CR。3.0之后版本默认为:SCRAM-SHA-12、spring-mongodb默认为:MONGODB-CR,并不支持设置认证方式;但是,最新的包已修复这个问题

    网上的教程,大多太旧了,所以出现jar包太老而是mongodb太老的问题,或者相反的问题,orz....其实一句话说就是注意版本或者最简单的就是直接用最新

    所以,若是你中途觉得菜鸟写的很好,难免会进坑然后又来看我的文章,这时候,我建议你从来来一次...因为,我把前面的不兼容的错修改,但并没有重点指出,因为这只是版本问题。你直接再搞个低版本基本就不会有事了。

    代码

    public class MongoDBConnect {
        public static String HOST = "127.0.0.1";
        public static String PORT = "27017";
    
        public static void main(String[] args) {
            try {
                System.out.println("MongoDBConnect to database begin");
                //连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址
                //ServerAddress()两个参数分别为 服务器地址 和 端口
                ServerAddress serverAddress = new ServerAddress("localhost", 27017);
                List<ServerAddress> addrs = new ArrayList<ServerAddress>();
                addrs.add(serverAddress);
    
                //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
                MongoCredential credential = MongoCredential.createScramSha1Credential("admin", "admin", "123456".toCharArray());
                List<MongoCredential> credentials = new ArrayList<MongoCredential>();
                credentials.add(credential);
    
                //通过连接认证获取MongoDB连接
                MongoClient mongoClient = new MongoClient(addrs, credentials);
                //连接到数据库
                MongoDatabase mongoDatabase = mongoClient.getDatabase("admin");
                System.out.println("MongoDBConnect to database successfully");
    
                //创建集合
    //            mongoDatabase.createCollection("test");
    //            System.out.println("集合创建成功");
    //选择集合
                MongoCollection<Document> collection = mongoDatabase.getCollection("test");
                System.out.println("集合 test 选择成功");
    
                /**插入文档
                 * 1. 创建文档 org.bson.Document 参数为key-value的格式
                 * 2. 创建文档集合List<Document>
                 * 3. 将文档集合插入数据库集合中 mongoCollection.insertMany(List<Document>) 插入单个文档可以用 mongoCollection.insertOne(Document)
                 * */
                Document document = new Document("title", "MongoDB").
                        append("description", "database").
                        append("likes", 100).
                        append("by", "Fly");
                List<Document> documents = new ArrayList<Document>();
                documents.add(document);
                collection.insertMany(documents);
                System.out.println("文档插入成功");
    
    
                /**检索所有文档
                 * 1. 获取迭代器FindIterable<Document>
                 * 2. 获取游标MongoCursor<Document>
                 * 3. 通过游标遍历检索出的文档集合
                 * */
                FindIterable<Document> findIterable = collection.find();
                MongoCursor<Document> mongoCursor = findIterable.iterator();
                while (mongoCursor.hasNext()) {
                    System.out.println(mongoCursor.next());
                }
                System.out.println("检索所有文档成功");
    
    //更新文档   将文档中likes=100的文档修改为likes=200
                collection.updateMany(Filters.eq("likes", 100), new Document("$set", new Document("likes", 200)));
                //检索查看结果
                findIterable = collection.find();
                mongoCursor = findIterable.iterator();
                while (mongoCursor.hasNext()) {
                    System.out.println(mongoCursor.next());
                }
                System.out.println("更新文档成功");
    
                //删除符合条件的第一个文档
                collection.deleteOne(Filters.eq("likes", 200));
                //删除所有符合条件的文档
                collection.deleteMany(Filters.eq("likes", 200));
                //检索查看结果
                findIterable = collection.find();
                mongoCursor = findIterable.iterator();
                while (mongoCursor.hasNext()) {
                    System.out.println(mongoCursor.next());
                }
                System.out.println("删除文档成功");
    
            } catch (Exception e) {
                System.err.println(e.getClass().getName() + ": " + e.getMessage());
            }
        }
    }

    六 总结

    关于mongodb,redis,mysql 简要对比,其实这篇文章写得很好,我给个结论就行了

    https://www.cnblogs.com/lovychen/p/5613986.html

    mongodb:

    它是一个内存数据库,操作的数据都是放在内存里面的。

    但实际数据存在硬盘中,mmap的方式可以说是索引在内存中。

    持久化方式:

    mongodb的所有数据实际上是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。mongodb就在这块区域里面进行数据修改,避免了零碎的硬盘操作。

    至于mmap上的内容flush到硬盘就是操作系统的事情了,所以如果mongodb在内存中修改了数据后,mmap数据flush到硬盘之前,系统宕机了,数据就会丢失。

    redis:

    它就是一个不折不扣的内存数据库了。

    持久化方式:

    redis所有数据都是放在内存中的,持久化是使用RDB方式或者aof方式。

    mysql:

    无论数据还是索引都存放在硬盘中。到要使用的时候才交换到内存中。能够处理远超过内存总量的数据。

    数据量和性能:
    当物理内存够用的时候,redis>mongodb>mysql
    当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。mysql>mongodb>redis
     
    redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。
    mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。mongodb还是能够保证性能。有人使用mongodb存储了上T的数据。
    mysql根本就不需要担心数据量跟内存下的关系。不过,内存的量跟热数据的关系会极大地影响性能表现。

    总结就是

    虚拟内存不够是 选择mongodb和mysql

    虚拟内存够是 选择mongodbredis

    但实际上,更多公司选择redis和mysql,这就是技术栈的问题,毕竟nosql的定义和开发设计没几个程序员了解

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/ydymz/p/9814875.html
Copyright © 2011-2022 走看看