zoukankan      html  css  js  c++  java
  • MongoDB的安装与使用

      MongoDB是一款NoSql数据库。NoSql数据库叫非关系型数据库,NoSql的全名Not only sql为了解决高并发高可用高可扩展,以及大数据存储等一系列问题而产生的数据库解决方案NoSql它不能替代关系型数据库只能作为关系型数据库的一个良好补充

      NoSql数据库又分为多种,如键值(Key-Value)存储数据库(如redis),列存储数据库(如HBase),文档型数据库(如MongoDB),图形(Graph)数据库等。

      MongoDB作为文档型数据库,其典型应用是Web应用(与Key-Value类似,Value是结构化的),它的数据模型是 一系列键值对。MongoDB优势是数据结构要求不严格,操作灵活;劣势是查询性能不高,而且缺乏统一的查询语法。

      当前,我们以win7系统为例,64位win7安装MongoDB相对简单,因为MongoDB官网在community server版本(https://www.mongodb.com/download-center#community)中仅推荐了一款64位的MongoDB,在安装方面,网上也提供了不少帖子,相信大家都能顺利安装好。

     

      相比较而言,32位的win7系统在安装MongoDB时就要繁琐很多。那么,对于使用32位win7系统的朋友而言,应该如何安装MongoDB,以及使用呢?

      第一步:

      首先,在这个网址中https://www.mongodb.org/dl/win32/i386下载后缀为msi的MongoDB,此处以v3.2.19版本为例。

      下载了MongoDB后,双击运行即可进入安装;在安装过程中,可以选择程序安装路径。在此,我将程序安装路径改为E:mongodb2。

      MongoDB安装好后,在E:mongodb2下会生成一个bin目录,bin目录是可执行文件目录,启动mongo的服务器端以及客户端都在这里;同时,我们还要在E:mongodb2下新建三个目录:conf为配置文件存放目录;data为数据存放目录;log为日志存放目录。如下所示:

      接着,在conf下创建一个名称为mongod.conf的配置文件,里面内容如下:

    port=6699
    dbpath=E:mongodb2data
    logpath=E:mongodb2logmongod.log 

       配置文件里配置了MongoDB服务开启后的端口,数据文件目录,日志存放目录。为mongod.conf的常见基本配置参数释义(本文简单演示,仅配置上面三项即可):

    #数据库数据存放目录
    dbpath=../data
    #数据库日志存放目录
    logpath=../logs/mongod.log 
    #以追加的方式记录日志
    logappend = true
    #端口号 默认为27017
    port=6699
    #以后台方式运行进程
    fork=true 
    #开启用户认证
    auth=true
    #关闭http接口,默认关闭http端口访问
    nohttpinterface=true
    #mongodb所绑定的ip地址
    bind_ip = 127.0.0.1 
    #启用日志文件,默认启用
    journal=true 
    #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
    quiet=true  

      同时,在log目录下创建名称为mongod.log的文件,里面内容可以为空,在MongoDB服务启动后,这个日志文件里会记录服务运行情况。

      第二步:

      接下来,将MongoDB安装为Windows服务,这步很关键。先是切换到bin目录下,然后打开DOS窗口,执行如下命令:

    E:mongodb2in>mongod --dbpath "E:mongodb2data" --logpath "E:mongodb2logmongod.log" --install --serviceName "MongoDB"  --journal
    

       这时,查看win7计算机管理的服务列表,可以看到名称为MongoDB的Windows服务已经在里面。

      第三步:

      我们可以Windows的服务列表窗口里开启MongoDB服务,也可以在DOS窗口里启动MongoDB服务:

    net start MongoDB
    

       这时,计算机的服务列表里显示MongoDB服务已经开启。我们还可以点击MongoDB的启动类型,将其设置为手动。如下所示:

      其实,我们在进行完“第二步”后,不必再进行第三步(第三步主要是为了演示Windows服务的启动,此处可以忽略),直接通过一个批处理文件配置MongoDB的端口(如果MongoDB没有安装在本地,需要在配置文件mongod.conf里加上"bind_id=ip地址")等信息,然后启动MongoDB服务;接着,再通过一个批处理文件启动操作MongoDB的客户端即可。这就是我们下面要讲述的内容。

      为了以后启动MongoDB服务,以及使用MongoDB服务更方便,我们还可以制作两个批处理文件。一个名称为“启动MongoDB服务端.bat”,内容如下:

    E:
    cd E:mongodb2in
    mongod -f E:mongodb2confmongod.conf --journal
    pause
    

       另一个是启动MongoDB客户端,从而操作MongoDB。这个批处理文件名称为“启动MongoDB客户端.bat”,内容如下:

    E:
    cd E:mongodb2in
    mongo 127.0.0.1:6699/test
    pause
    

       接着,双击“启动MongoDB服务端.bat文件,启动成功后显示如下:

      这时,在浏览器地址栏里输入http://localhost:6699,显示如下:

       这说明MongoDB服务已经设置和开启成功。接下来,启动MongoDB客户端,操作MongoDB。

      双击“启动MongoDB客户端.bat”批处理文件,显示如下:

      说明MongoDB客户端启动成功。

      到此,MongoDB安装完毕,客户端也启动完毕,我们接下来操作MongoDB。

      MongoDB有这些基本操作命令,我们了解下:

     (1)查询数据库结构: 
    #查看现有数据库
    > show dbs    
    local  0.078GB
    #使用某个数据库;没有就创建并使用
    > use yc
    switched to db yc
    #插入数据
    > db.yc.insert({"_id":1001,"name":"lzy","sex":"男"})
    WriteResult({ "nInserted" : 1 })
    #插入指定数据库下的所有数据
    > db.yc.find()
    { "_id" : 1001, "name" : "lzy", "sex" : "男" }
    #更新数据
    > db.yc.update({"_id":1001},{"name":"nlz","sex":"女"})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.yc.find()
    { "_id" : 1001, "name" : "nlz", "sex" : "女" }
    #删除数据
    > db.yc.remove({"_id":1001})
    WriteResult({ "nRemoved" : 1 })
    > db.yc.find()
    #创建数据集合
    > db.createCollection("colA",{autoIndexId:true})
    {
            "note" : "the autoIndexId option is deprecated and will be removed i
            "ok" : 1
    }
    > db.colA.insert({"_id":1001,"name":"张三"})
    WriteResult({ "nInserted" : 1 })
    > for(i=1;i<=10;i++) db.colA.insert(data:i)
    2018-04-29T00:53:17.887+0800 E QUERY    [thread1] SyntaxError: missing ) aft
    #批量插入数据
    > for(i=1;i<=10;i++) db.colA.insert({data:i})
    WriteResult({ "nInserted" : 1 })
    > db.colA.find()
    { "_id" : 1001, "name" : "张三" }
    { "_id" : ObjectId("5ae4a71301b5efddc588c80a"), "data" : 1 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c80b"), "data" : 2 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c80c"), "data" : 3 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c80d"), "data" : 4 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c80e"), "data" : 5 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c80f"), "data" : 6 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c810"), "data" : 7 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c811"), "data" : 8 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c812"), "data" : 9 }
    { "_id" : ObjectId("5ae4a71301b5efddc588c813"), "data" : 10 }
    #修改数据集合里某个数据的值
    > db.colA.update({"name":"张三"},{"name":"李四"})

       上面是MongoDB的一些基本操作指令。通过上述操作,我们可以观察出一个特点,那就是:MongoDB存储数据是以json格式进行的(如:({"key":"value,..."}))。

      接下来,我们再看在Java程序中如何操作MongoDB。

      我们以idea这款IDE工具为例,创建一个工程,然后在工程里添加MongoDB与单元测试的依赖(这是因为我们要用单元测试展开测试),如下图:

       接下来,测试连接MongoDB服务(TestConnection2.java):

    package com.itszt;
    
    import com.mongodb.MongoClient;
    import com.mongodb.client.MongoDatabase;
    import org.junit.Test;
    
    /**
     * 测试连接MongoDB
     */
    public class TestConnection2 {
        @Test
        public void testConnMongo(){
            //连接到MongoDB服务
            MongoClient mongoClient=new MongoClient("127.0.0.1",6699);
            //连接到MongoDB数据库
            MongoDatabase mongoDatabase = mongoClient.getDatabase("test");
            System.out.println("mongoDatabase = " + mongoDatabase);
            System.out.println("MongoDB connect successfully");
            //关闭MongoDB服务
            mongoClient.close();
        }
    }
    

       控制台打印如下(显示正常):

    mongoDatabase = com.mongodb.MongoDatabaseImpl@150efb8
    MongoDB connect successfully
    

       接下来,我们再通过java程序操作MongoDB(TestCURD2.java):

      

    package com.itszt;
    
    import com.mongodb.BasicDBObject;
    import com.mongodb.MongoClient;
    import com.mongodb.client.FindIterable;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoCursor;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.model.CreateCollectionOptions;
    import org.bson.Document;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.regex.Pattern;
    
    /**
     * 测试MongoDB的数据操作
     */
    public class TestCURD2 {
        private MongoClient mongoClient;
        private MongoDatabase mongoDatabase;
    
        @Before
        public void init() {
            mongoClient = new MongoClient("127.0.0.1", 6699);
            mongoDatabase = mongoClient.getDatabase("test");
            System.out.println("MongoDB connect successfully");
        }
    
        @After
        public void close() {
            mongoClient.close();
        }
    
        @Test
        public void testCollection() {
            CreateCollectionOptions collectionOptions = new CreateCollectionOptions();
            collectionOptions.autoIndex(true);
            /*
                capped为true,表示起用封闭的集合,集合容量有固定上限,
                集合超过上限时会自动覆盖其最旧的目录
                如果capped为true,则必须指定size参数
                sizeInBytes()表示集合字节大小
             */
            /*collectionOptions.capped(true);
            collectionOptions.sizeInBytes(1024*1024*100);*/
    
            //设置集合中文档个数的上限
            collectionOptions.maxDocuments(1000);
            mongoDatabase.createCollection("colD", collectionOptions);
            MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
            System.out.println("colD = " + colD);
        }
    
        //测试对于数据集合的添加
        @Test
        public void testInsert() {
            MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
    
            ArrayList<Document> documents = new ArrayList<>();
            for (int i = 1; i <= 10; i++) {
                Document document = new Document();
                document.append("userName", "张三-" + i);
                document.append("userPwd", "admin_" + i);
                documents.add(document);
            }
            //批量插入数据
            colD.insertMany(documents);
    
            //如果插入单条数据,则是:
            //colD.insertOne(Docoment document);
        }
    
        //测试查询数据集合
        @Test
        public void testFind(){
            MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
    
            //正则条件
            BasicDBObject basicDBObjectReg = new BasicDBObject();
            Pattern pattern = Pattern.compile(".*[0]");
            basicDBObjectReg.put("$regex",pattern);
            //条件约束
            BasicDBObject basicDBObject = new BasicDBObject();
            basicDBObject.append("userName",basicDBObjectReg);
    
            FindIterable<Document> documents = colD.find(basicDBObject);
            MongoCursor<Document> iterator = documents.iterator();
            Document document =null;
            while (iterator.hasNext()){
                document = iterator.next();
                //取得整个数据
                System.out.println("document = " + document);
                //取得若干字段值
                System.out.println(document.get("userName")+"-->"+document.get("userPwd"));
            }
        }
    
        //测试对于数据集合的修改
        @Test
        public void testUpdate(){
            MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
    
            BasicDBObject basicDBObjectOld = new BasicDBObject();
            basicDBObjectOld.put("userName","李四");
    
            BasicDBObject basicDBObjectNew = new BasicDBObject();
            basicDBObjectNew.put("userName","王五");
    
            BasicDBObject update = new BasicDBObject("$set", basicDBObjectNew);
            colD.updateOne(basicDBObjectOld,update);
    
            //批量修改
            //colD.updateMany(basicDBObjectOld,update);
        }
    
        //测试对于数据集合的删除
        @Test
        public void testDelete(){
            MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
    
            //正则条件
            BasicDBObject basicDBObjectReg = new BasicDBObject();
            Pattern pattern = Pattern.compile("王.*");
            basicDBObjectReg.put("$regex",pattern);
            //条件约束
            BasicDBObject basicDBObject = new BasicDBObject();
            basicDBObject.append("userName",basicDBObjectReg);
    
            colD.deleteOne(basicDBObject);
    
            //批量删除
    //        colD.deleteMany(basicDBObject);
        }
    } 
  • 相关阅读:
    基于nginx+tomcat部署商城系统并连接数据库
    nginx防DDOS、cc、爬虫攻击
    nginx企业级优化
    基于nginx结合openssl实现https
    nginx打包成rpm
    产品运营3部曲:引量、留存、活跃
    从赢利前和赢利后分析 提高美国市场APP安装量的技巧
    APP海外优质推广渠道(三):海外ASO服务/工具汇总
    APP海外优质推广渠道(二):海外广告联盟/平台汇总
    关于O2O项目的个人看法
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8970066.html
Copyright © 2011-2022 走看看