zoukankan      html  css  js  c++  java
  • 非关系数据库之mongodb入门到实战(6)mongodb基础详解

    第一章、mongodb入门

    一、什么是MongoDB

     
    image.png

    MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
    MongoDB是开源,高性能的NoSQL数据库,支持索引、集群、复制和故障转移、各种语言的驱动程序丰富;

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
    MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
    MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
    MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

    二、MongoDB的安装

    1、下载MongoDB

    可以从官网下载安装,下载地址:MongoDB官网

     
    image.png
    2、安装

    下载成功后点击msi文件直接next,这里以Windows操作系统为例。


     
    MongoDB启动安装.png
    3、环境配置

    安装文件里面有两个主要的部分:mongod.exe和mongo.exe,分别为服务器和操作后台。如果要成功运行MongoDB,需要先搭建并运行服务器,其次在保持服务器运行的情况下再打开后台。

     
    MongoDB安装目录文件.png

    由于前期的安装不会生成数据目录,需要自己创建。打开cmd,在D盘创建数据文件夹,如D:datadb用于存放mongodb的数据文件,也可使用Windows自带的界面在D盘右键创建。


     
    db.png

    运行cmd,打开安装目录下的bin文件,在bin目录中执行mongod.exe文件。输入如下:


     
    mongod.png

    保持之前的cmd窗口,再打开一个cmd窗口来运行mongo.exe,同样打开bin文件,执行mongo.exe,就可以进入MongoDB的Shell界面。


     
    mongo.png

    至此,MongoDB安装完毕,然后就可以使用命令行操作数据库了。

    4、把MongoDB服务器作为Windows服务运行

    将MongoDB服务器安装为Windows服务,可以避免每次使用MongoDB都要开启mongod.exe程序,当mongod.exe被关闭时,mongo.exe 就无法连接到数据库的问题。

    1)打开MongoDB的安装目录如“D:Program FilesMongoDBServer3.6in”,并在此目录下新建一个mongo.config文件,文件内容如下:

    ##数据库目录##
    dbpath=C:datadb
    
    ##日志输出文件##
    logpath=C:datalogdb.log
    

    2)cmd进入命令行,使用cd切换目录到安装目录,如:cd D:Program FilesMongoDBServer3.6in
    安装MongoDB服务且指定配置文件,如:mongod --config "D:Program FilesMongoDBServer3.6inmongo.config" --install

     
    配置服务.png

    3)启动服务
    启动服务:net start mongodb
    停止服务:net stop mongodb

     
    启动服务.png

    打开任务管理器可以看到MongoDB已经启动


     
    进程管理.png

    把MongoDB服务器作为Windows服务运行之后,就不用再启动MongoDB的服务器,直接运行mongo.exe操作后台程序就可以使用。

    三、数据库的基本操作

    1、基本概念

    在MongoDB中基本的概念是文档、集合、数据库。


     
    image.png
    2、基本操作

    创建数据库:

    • 语法:use database_name
    • 示例:use DB_Demo
      如果数据库不存在,则创建数据库,否则切换到指定数据库。
      要显示刚创建的数据库需要向 数据库插入一些数据。

    删除数据库:

    • 语法:db.dropDatabase()
    • 示例:先切换到数据库 DB_Demo,再执行删除操作。(可以使用 db 命令查看当前数据库名,防止误操作)
      use DB_Demo
      db.dropDatabase()

    创建集合:

    • 语法:db.createCollection(name, options)
    • 示例:先切换到数据库 DB_Demo并创建users集合
      use DB_Demo
      db.createCollection("users")

    删除集合:

    • 语法:db.collection.drop()
    • 示例:db.user.drop()

    插入文档:

    • 语法:db.collection_name.insert(document)
    • 示例:db.users.insert({name:'zhangsan',age:18})
    • 语法:db.collection_name.save(document)
    • 示例:db.users.save({name:'lisisi',age:16})

    说明:insert和save方法都可以插入数据,当默认的“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息。

    • 语法:db.collection_name.insertOne(document)
    • 说明:向指定集合中插入一条文档数据
    • 语法:db.collection_name.insertMany(document)
    • 说明:向指定集合中插入多条文档数据(注意是数组)
    • 示例:db.users.insertMany([{name:'wangsansan',age:'22'},{name:'zhanglili',age:21}])

    删除文档:

    • 语法:db.collection_name.remove(条件)
    • 示例: db.users.remove({'name':'zhangsan'})
    • 语法:db.collection_name.deleteOne(条件)
    • 说明: 删除 指定条件的一个文档
    • 语法:db.collection_name.deleteMany(条件)
    • 说明: 删除 指定条件的全部文档

    修改文档:

    • 语法:db.collection_name.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}})
    • 说明: 只修改第一条发现的文档
    • 示例:db.users.update({'name':'zhangsan'},{$set:{'name':'wanger'}})
    • 语法:db.collection_name.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}},{multi:true});
    • 说明: 修改多条相同的文档,需要设置 multi 参数为 true。

    查询文档:

    • 查询集合中所有数据:db.collection_name.find(); 例:db.users.find().pretty()
    • 按条件查询(支持多条件):db.collection_name.find(条件); 例:db.users.find({name:'zhangsan'});
    • 限制数量:db.collection_name.find().limit(数量);
    • 跳过指定数量:db.collection_name.find().skip(数量);
    • 查询第一条(支持条件):db.collection_name.findOne(条件);
    • 查询数量:db.collection_name.find().count();
    • 排序:db.collection_name.find().sort({"字段名":1}); 1:表示升序,-1:表示降序
    • 指定字段返回: db.collection_name.find({},{"字段名":0}); 1:返回 0:不返回

    常用命令:

    • 使用 db 命令查看当前数据库名
    • 查看所有数据库,可以使用 show dbs 命令
    • 查看已有集合,可以使用 show collections 命令
    • find() 方法以非结构化的方式来显示所有文档,语法:db.collection_name.find()
    • 以易读的方式来读取数据使用 pretty() 方法,语法:db.collection_name.find().pretty()
    • use database_name如果数据库不存在,则创建数据库,否则切换到指定数据库

    四、其它注意事项

    1、数据库命名规则:
    • 不能是空字符串
    • 不能含有空格、.、$、/、和(空字符)
    • 应全部小写
    • 最多64字节
    2、保留数据库

    有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库

    • admin:’root‘数据库,要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限,一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器
    • local:这个数据库永远不会被复制,可以用来存储于本地单台服务器的任意集合
    • config:当mongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关信息

    五、可视化工具GUI

    1、MongoDB可视化工具

    MongoDB安装完成后会有一个可视化工具,如图,可以点击连接到本地数据库,查看本地的数据库名称,以及创建数据库,删除数据库等操作。


     
    image.png

    点击连接后会列出当前存在的数据库列表。


     
    image.png
    2、第三方可视化工具

    下载地址:robomongo官方网站

    第二项是一个绿色版,解压后在文件夹中找到exe文件直接运行即可。


     
    image.png

    运行后连接到本地数据库,右键打开shell脚本编写界面可以执行MongoDB相关命令,执行快捷键F5或Ctrl+Enter。


     
     

    第二章、mongodb实战

    linux 环境搭建

    MongoDB 官方提供了各种 linux 的发行版本,强烈建议你去官方下载,不要从乱七八糟的渠道下载乱七八糟的安装包。

    下载地址:https://www.mongodb.com/download-center#community

    安装过程(基于 Ubuntu - 16.04 - 64位)

    curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz  # 下载
    tar -zxvf mongodb-linux-x86_64-3.0.6.tgz                                 # 解压
    mv  mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb                       # 将解压包拷贝到指定目录
    export PATH=/usr/local/mongodb/bin:$PATH                                 # 添加到 PATH 路径
    

    创建数据库目录

    数据库目录在安装过程中不会自动创建,需要你手动找一个你觉得合适的地方创建 data 目录。

    sudo mkdir -p /data/db               # 我选择创建在根目录下
    

    划重点 :/data/db 是 MongoDB 默认的启动的数据库路径。

    如果你觉得放在根目录下不爽,可以通过 --dbpath 来指定。

    mongod --dbpath <其他目录>             # <其他目录> 替换成你觉得爽的数据目录
    

    MongoDB后台管理 Shell

    输入命令 mongo 。

    当你进入 mongoDB 后台后,它默认会链接到 test 数据库。

    # mongo
    MongoDB shell version: 2.6.10
    connecting to: test
    > 
    

    基本概念

    文档

    文档是 MongoDB 中数据的基本单元,理解起来很简单,就是一组数据有序的放在一起就是文档。

    例如:

    单键值文档 {"userName":"WuJiaYi"}

    多键值文档 {"_id" : ObjectId("58097dfe7e6d64baca4847365"), "name" : "WuJiaYi", "add" : "China" }

    集合

    多个文档放在一起就是集合。

    数据库

    多个集合放在一起就是数据库。

    关系如下图所示:

     
    image

    shell 部分命令表

    show dbs 显示所有数据库。

    > show dbs      # 新创建的数据库不会显示。需要写入一些数据,才会显示。
    admin  (empty)
    local  0.078GB
    test   0.078GB
    > 
    

    db 显示当前数据库。

    > db 
    test
    > 
    

    use 切换 或 创建数据库。

    > use local     # 如果数据库不存在,则创建数据库,否则切换到指定数据库。
    switched to db local
    > db
    local
    > 
    

    db.dropDatabase() 删除数据库。

    > use test             # 切换到 test 数据库
    switched to db test
    > db.dropDatabase()     # 删除当前的数据库
    { "dropped" : "test", "ok" : 1 }
    > show dbs              # test 数据库被删除了
    admin  (empty)
    local  0.078GB
    > 
    

    db.createCollection("NAME") 创建集合。

    > db.createCollection("test")
    { "ok" : 1 }
    >
    

    show collections 显示当前数据库的集合。

    > show collections
    system.indexes
    wujiayi
    wweeww
    > 
    

    db.NAME.drop() 删除集合。

    > show collections    # 显示所有集合
    system.indexes
    wujiayi
    wweeww
    > db.wujiayi.drop()   # 删除 wujiayi 这个集合
    true
    > show collections    # wujiayi 集合已经被删除了 
    system.indexes
    wweeww
    > 
    

    db.COL_NAME.insert(DOC) 插入文档。

    >db.col.insert({title: 'MongoDB 手册',
        name: '吴佳轶',
        url: 'http://www.wujiayi.vip',
        add: 'Beijing',
    })
    

    db.COL_NAME.update(DOC) 更新文档。

    >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})  # col是集合的名字
    

    db.COL_NAME.remove(DOC,NUMBER) 删除文档。

    >db.col.remove({'title':'MongoDB'},1)     # 查找符合 title 为 MongoDB 的文档,删除一条。
    WriteResult({ "nRemoved" : 1 })           # 删除了两条数据
    

    db.COL_NAME.find().pretty() 查询所有文档。

    > db.col.find().pretty()   # 格式化查询所有文档
    > db.col.findOne()         # 查询一条数据
    > db.col.find()            # 非格式化查询
    

    Node.js 连接 MongoDB

    创建数据库

    如果数据库不存在则创建。

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/WuJiaYi";
     
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      console.log("数据库已创建!");
      db.close();
    });
    

    创建合集

    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost:27017/WuJiaYi';
    MongoClient.connect(url, function (err, db) {
        if (err) throw err;
        console.log('数据库已创建');
        var dbase = db.db("WuJiaYi");
        dbase.createCollection('data', function (err, res) {
            if (err) throw err;
            console.log("创建集合!");
            db.close();
        });
    });
    

    插入数据

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("WuJiaYi");
        var myobj = { name: "吴佳轶", url: "www.wujiayi.vip" };
        dbo.collection("data").insertOne(myobj, function(err, res) {
            if (err) throw err;
            console.log("文档插入成功");
            db.close();
        });
    });
    

    插入多条数据

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("WuJiaYi");
        var myobj =  [
            { name: '吴佳轶', url: 'http://www.wujiayi.vip', type: 'cn'},
            { name: '魔法世界', url: 'http://www.magicworld.vip', type: 'ch'},
            { name: '魔法学校', url: 'http://www.magicshool.vip', type: 'ch'}
           ];
        dbo.collection("data").insertMany(myobj, function(err, res) {
            if (err) throw err;
            console.log("插入的文档数量为: " + res.insertedCount);
            db.close();
        });
    });
    

    查询数据

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("WuJiaYi");
        dbo.collection("data"). find({}).toArray(function(err, result) { // 返回集合中所有数据
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });
    

    查询指定条件的数据

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("WuJiaYi");
         var whereStr = {"name":'吴佳轶'};  // 查询条件
        dbo.collection("data").find(whereStr).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });
    

    更新数据

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("WuJiaYi");
        var whereStr = {"name":'吴佳轶'};  // 查询条件
        var updateStr = {$set: { "url" : "http://wujiayi.vip" }};
        dbo.collection("data").updateOne(whereStr, updateStr, function(err, res) {
            if (err) throw err;
            console.log("文档更新成功");
            db.close();
        });
    });
    

    更新多条数据

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("WuJiaYi");
        var whereStr = {"type":'ch'};  // 查询条件
        var updateStr = {$set: { "url" : "http://www.magicworld.vip" }};
        dbo.collection("data").updateMany(whereStr, updateStr, function(err, res) {
            if (err) throw err;
             console.log(res.result.nModified + " 条文档被更新");
            db.close();
        });
    });
    

    删除数据

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("WuJiaYi");
        var whereStr = {"name":'吴佳轶'};  // 查询条件
        dbo.collection("data").deleteOne(whereStr, function(err, obj) {
            if (err) throw err;
            console.log("文档删除成功");
            db.close();
        });
    });
    

    删除多条数据

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("WuJiaYi");
        var whereStr = { type: "en" };  // 查询条件
        dbo.collection("data").deleteMany(whereStr, function(err, obj) {
            if (err) throw err;
            console.log(obj.result.n + " 条文档被删除");
            db.close();
        });
    });
  • 相关阅读:
    python 中 time 模块 格式化 format
    python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出
    Quick-lua3.3之listview
    健身计划表
    quick-cocos2d-x 实现在lua里面完成android支付宝的接入
    lua table 排序--满足多条件排序
    lua 操作中文字符串之截取和长度竖排显示
    ClippingNode实现新手引导高亮裁切
    quick cocos2dx lua 内存释放
    cocos2d-x的lua脚本加载CocostudioUI两种方式
  • 原文地址:https://www.cnblogs.com/huanghanyu/p/13808834.html
Copyright © 2011-2022 走看看