MongoDB 纯代码快速学习 增删改查 用户安全

// 1. MongoDB 的结构介绍
// MongoDB 是一个可拓展、开源、表结构自由、用 C++ 语言编写且面向文档的高性能分布式数据库。为 WEB 应用提供可扩展的高性能数据存储解决方案
// MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的
// MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组
// mongo适合存储大量关联性不强的数据;大批量,高并发,不规则
// mongo存储结构: 库、集合、文档、字段
// mongo不需要预先定义表结构,数据的字段可以任意变动,并发写入的速度也远远超过关系型数据库
// 模式自由: 表结构可拓展,集合(表)中文档(一行记录)的字段(拥有的列)是可以变化的
// 支持完全索引: 可以在任意属性上建立索引,包含内部对象。MongoDB的索引和RDBMS 的索引基本一样,可以在指定属性、内部对象上创建索引以提高查询的速度。除此之外,MongoDB 还提供创建基于地理空间的索引的能力
// 使用高效的二进制数据存储: 包括大型对象(如视频)。使用二进制格式存储,可以保存任何类型的数据对象
// GridFS功能: GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件
// 网站实时数据处理:它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
// 不适合复杂的跨文档(表)级联查询
// 不适合要求高度事务性的系统:例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序


// 集合,文档
// 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格
// 集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性
// 文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点
    // BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称


// 可执行文件
// mongod:启动数据库实例的可执行文件,是整个MongoDB中最核心的文件,负责数据库的创建、删除等各项管理工作,运行在服务器端,监听客户端的连接请求。
// mongo进程:是一个与mongod进程进行交互的JavaScript Shell进程,它提供了一些交互的接口函数为系统管理员对数据库进行管理。mongo 可以直接进入mongo环境
// mongodump:将数据导为BSON格式的文件,备份数据库,同时可以利用这些dump文件重建数据库。使用mongodump -help可以查看支持的指令。
// mongorestore:恢复备份文件。
// mongoexport:将数据导出成json或csv格式的文件。
// mongoimport:将json或csv格式的文件导入到mongo。
// mongos:在分片中用到的进程文件,所有应用程序端的查询操作都会先用它分析,然后将查询定位到某一个分片上,它的监听作用与mongod的监听作用类似。
// mongofiles:mongofiles提供了一个操作MongoDB分布式文件存储GridFS系统的命令行接口。
// mongostat:展示当前正在运行的mongod或mongos实例的状态工具,相当于unix/linux的 vmstat, 但是它提供的数据只与运行的mongod或mongos的实例相关。
// mongotop:提供了一个分析MongoDB实例在读写数据上的时间跟踪方法。


// 标准 URI 连接数据库语法:
// mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
// 使用用户名密码连接: mongodb://admin:123456@localhost/test
// 以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒: mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
// 参数说明::
// mongodb:// 这是固定的格式,必须要指定。
// username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库
// host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
// portX 可选的指定端口,如果不填,默认为27017
// /database 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库。
// ?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开


// 数据类型     	描述
// String     	字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
// Integer     	整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
// Boolean     	布尔值。用于存储布尔值(真/假)。
// Double     	双精度浮点值。用于存储浮点值。
// Min/Max keys	将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
// Array     	用于将数组或列表或多个值存储为一个键。
// Timestamp    时间戳。记录文档修改或添加的具体时间。
// Object     	用于内嵌文档。
// Null     	用于创建空值。
// Symbol     	符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
// Date     	日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
// ObjectId	    对象 ID。用于创建文档的 ID,可以很快的去生成和排序,包含 12 bytes
    // 前4个字节表示创建unix时间戳,格林尼治时间UTC时间,比北京时间晚了8小时
    // 接下来的 3 个字节是机器标识码
    // 紧接的两个字节由进程 id 组成 PID
    // 最后三个字节是随机数
// Binary       Data	二进制数据。用于存储二进制数据。
// Code     	代码类型。用于在文档中存储 JavaScript 代码。
// Regular      expression	正则表达式类型。用于存储正则表达式。


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


// 看每个命令的详细用法,可以使用
db.listCommands()

// 数据库操作更详细的帮助命令
db.help()

// 对指定数据库的集合进行操作、管理和监控
db.mycoll.help()


// 数据库的基本操作
// 显示所有数据的列表
show dbs
// 数据库不存在,则创建数据库,否则切换到指定数据
use user
// 显示当前数据库
db
// 删除数据库
db.dropDatabase()
// 显示集合名
show collections
// 创建集合user
db.createCollection("user")
// 删除集合user
db.user.drop()


// 插入文档
// 注意: 在 MongoDB 中,直接插入内容会自动创建集合
// 使用insert()方法, 不推荐使用
db.user.insert({
    "name":"zhangsan",
    "age": 18
})
// insertOne()方法插入一条数据
db.user.insertOne({
    name: 'root',
    age: 100,
    permission: 1
})
// insertMany()方法向指定集合中插入多条文档数据, 可指定参数
db.user.insertMany([
    {
        "name":"zhangsan",
        "age": 18
    },
    {
        "name":"lisi",
        "age": 20
    }
])


// 删除文档
// deleteOne() 和 deleteMany()
db.user.deleteOne({
    name: 'ximingx'
})


// 更新文档
// 集合user中名称为zhangsan的用户的age更新成21
db.user.update({
    'name':'zhangsan'
},{
    $set:{
        'age': 21
    }
})
// 更新一条:db.collection.updateOne()
// 更新多条:db.collection.updateMany()


// bulk-write 操作
// MongoDB批量操作支持同时执行一批写操作,写操作包括:插入文档、更新文档、删除文档
db.user.bulkWrite(
  [
     {
        insertOne: {
            // 插入文档
           "document": {
              "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4
           }
        }
     },
     {
        deleteOne: {
            // 删除条件
            filter: {
                "char": "Brisbane"
            }
        }
     },
     {
        updateOne: {
            // 更新条件
            "filter" : {
                "char" : "Eldon"
            },
            // 更新内容
            "update" : {
                $set : {
                    "status" : "Critical Injury"
                }
            }
        }
     }
  ]
 );


// 文档查询操作
// 查询user文档中的所有
db.user.find()
// 集合user中查询 name为ximingx
db.user.find({
    'name': 'ximingx'
})
// 集合user中查询 name为ximingx 且 指定指定返回哪些键
db.user.find({
    'name': 'ximingx'
}, {"permission": 1})
// 查询 name为ximingx 且 age为20 的数据
db.user.find({
    'name':'ximingx',
    'age': 18
})
// 集合user 中查询 name为ximingx 或 age为20 的数据
db.user.find({
    $or: [
    {
        'name':'ximingx'
    },
    {
        'age': 20
    }]
})
// 集合user 中查询 permission为1 且 (name为ximingx 或 age为20) 的数据
db.user.find({
    permission: 1,
    $or: [
    {
        'name':'ximingx'
    },
    {
        'age': {
            $gt: 20
        }
    }]
})
// 条件操作符
// (>) 大于 - $gt
// (<) 小于 - $lt
// (>=) 大于等于 - $gte
// (<=) 小于等于 - $lte
// (!==) 不等于 $ne
// user集合中 age小于30
db.user.find({
    age : {
        $lt : 30
    }
})
// user集合中 age小于30
db.user.find({
    age : {
        $lt: 30,
        $gte: 20
    }
})
// user集合中 age不等于20
db.user.find({
    age : {
        $ne: 20
    }
})
// user集合中 age等于20,99, 25
db.user.find({
    age: {
        "$in": [99, 20, 25]
    }
})
// regexp
db.user.find({
    age: /1/
})
// 使用limit()方法来读取指定数量的数据
// 使用skip()方法来跳过指定数量的数据
// 如显示查询文档中的两条记录
db.user.find({
    age : {
        $lt : 30
    }
}).limit(2)
// 以下实例只会显示第二条文档数据
db.user.find({

}).limit(1).skip(1)
// sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式
// 其中 1 为升序排列,而 -1 是用于降序排列。
// 执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
db.user.find({

},{
    "age":1
}).sort({
    "likes": -1
})
// 返回匹配数据的长度
db.user.find().count()
// 格式化的方式显示所有文档
db.user.find().pretty()
// 如果存在字段love,就返回
db.user.find({"love": {"$exists": true}})
// 我们也可以判断不存在, 如果不存在字段love,就返回
db.user.find({"love": {"$exists": false}})


// 集合中列的各种操作
// 修改age为 31 的列的address列的名称修改为address2,只会修改一条记录
db.user.update(
    {
        age: 31
    },
    {
        $rename: {
            address: 'address2'
        }
    }
)
// name为张三的address列的名修改为address2,会修改所有满足条件的记录。
db.user.update(
    {
        age: 31
    },
    {
        $rename: {
            address: 'address2'
        }
    },{
        multi: true
    }
)
// 更新特定字段
db.user.update(
    {
        "_id": 123
    },
    {
        "$set": {
            "count": 10000
        }
    }
)
// 删除特定字段
db.user.update(
    {
        "_id": 123
    },
    {
        "$unset": {
            "count": 10000
        }
    }
)


// 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录
// 这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的
// 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
// MongoDB使用 createIndex() 方法来创建索引
// 语法格式:db.collection.createIndex(keys, options)
// 语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
db.user.createIndex(
    {
        "title": 1,
        "description": -1
    }
)
// 查看集合索引
db.user.getIndexes()
// 查看集合索引大小
db.user.totalIndexSize()
// 删除集合所有索引
db.user.dropIndexes()
// 删除集合指定索引
db.user.dropIndex("索引名称")
// 例如数据记录中 createDate 为日期类型时:①设置时间180秒后自动清除;②设置在创建记录后,180 秒左右删除。
db.user.createIndex(
    {
        "createDate": 1
    },
    {
        expireAfterSeconds: 180
    }
)
// 使用索引是有代价的,对于添加的每一个索引,每次写操作(插入、更新、删除)都将耗费更多的时间
// 这是因为,当数据发生变动时,MongoDB不仅要更新文档,还要更新集合上所有的索引
// 所以,如果很少对集合进行读取操作,建议不使用索引


// MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果
// aggregate() 方法
// 通过字段 by_user 字段对数据进行分组,并计算 by_user 字段相同值的总和
db.user.aggregate([
    {
        $group : {
            _id : "$name",
            num_tutorial : {
                $sum : 1
            }
        }
    }
])
// [
//  {
//    "_id": "ximingx",
//    "num_tutorial": 2
//  },
//  {
//    "_id": "zhangsan",
//    "num_tutorial": 1
//  },
//  {
//    "_id": "hsl",
//    "num_tutorial": 1
//  },
//  {
//    "_id": "admin",
//    "num_tutorial": 1
//  }
//]
// $sum 计算总和
db.user.aggregate([
    {
        $group: {
            _id: "$name",
            num_tutorial: {
                $sum : 1
            }
        }
    }
])
// $avg 计算平均值
db.user.aggregate([
    {
        $group: {
            _id : "$name",
            num_tutorial : {
                $avg : "$age"
            }
        }
    }
])
// $min 获取集合中所有文档对应值得最小值
db.user.aggregate([
    {
        $group: {
            _id : "$name",
            num_tutorial : {
                $min : "$age"
            }
        }
    }
])
// $max 获取集合中所有文档对应值得最大值
db.user.aggregate([
    {
        $group: {
            _id : "$name",
            num_tutorial : {
                $max : "$age"
            }
        }
    }
])


// 数据的导入导出
// Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据
// mongoexport -d dbname -c collectionname -o file --type json/csv -f field
// -d 数据库名
// -c collection名
// -o 输出的文件名
// —type 输出的格式,默认为json
// -f 输出的字段,如果—type为csv,则需要加上 -f “字段名”
// mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
// -d 数据库名
// -c collection名
// —type 导入的格式,默认json
// -f 导入的字段名
// —headerline 如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
// —file 要导入的文件


// MongoDB数据备份
// 在Mongodb中使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中
// mongodump -h dbhost -d dbname -o dbdirectory
// -h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
// -d:需要备份的数据库实例,例如:test
// -o:备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。
// MongoDB数据恢复
// mongorestore -h dbhost -d dbname --dir dbdirectory
// -h:MongoDB所在服务器地址
// -d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
// —dir:备份数据所在位置,例如:/home/mongodump/itcast/
// —drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!


// mongodb用户
// 要添加用户,可使用MongoDB提供的db.createUser()方法。 添加用户时,可以为用户分配角色以授予权限,还可以更新现有用户,例如更改密码并授予或撤销角色
// 注意:在数据库中创建的第一个用户应该是具有管理其他用户的权限的用户管理员
// 添加用户时,可以在特定数据库中创建用户。该数据库是用户的认证的数据库。
// 用户可以跨不同数据库拥有权限; 即用户的权限不限于认证数据库。 通过分配给其他数据库中的用户角色,在一个数据库中创建的用户可以拥有对其他数据库的操作权限。
// 用户名和认证数据库作为该用户的唯一标识符。 也就是说,如果两个用户具有相同的名称,但是在不同的数据库中创建,则它们是两个不同的用户。 如果您打算拥有具有多个数据库权限的单个用户,请在适用的数据库中创建具有角色的单个用户,而不是在不同数据库中多次创建用户。
// 要验证用户,也可以在连接到 mongod 或 mongos 实例时使用命令行身份验证选项(例如:-u,-p,–authenticationDatabase)先连接到 mongod 或 mongos 实例,然后针对身份验证数据库运行 authenticate 命令或db.auth()方法。
// MongoDB 默认安装完成以后,只允许本地连接,同时不需要使用任何账号密码就可以直接连接MongoDB,这样就容易被黑,让支付一些比特币,所以为了避免这些不必要的麻烦,所以我们需要给Mongo设置一个账号密码

// 创建管理员用户
use admin
// switched to db admin
db.createUser({user: "admin",pwd: "password",roles: ["root"]})
// Successfully added user: { "user" : "admin", "roles" : [ "root" ] }

// 认证登录
db.auth("admin", "password")

// roles 类型
// 数据库用户角色(Database User Roles)
//     read:授予User只读数据的权限
//     readWrite:授予User读写数据的权限
//
// 数据库管理角色(Database Administration Roles):
//     dbAdmin:在当前dB中执行管理操作
//     dbOwner:在当前DB中执行任意操作
//     userAdmin:在当前DB中管理User
//
// 备份和还原角色(Backup and Restoration Roles):
//     backup
//     restore
//
// 跨库角色(All-Database Roles):
//     readAnyDatabase:授予在所有数据库上读取数据的权限
//     readWriteAnyDatabase:授予在所有数据库上读写数据的权限
//     userAdminAnyDatabase:授予在所有数据库上管理User的权限
//     dbAdminAnyDatabase:授予管理所有数据库的权限
//
// 集群管理角色(Cluster Administration Roles):
//     clusterAdmin:授予管理集群的最高权限
//     clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
//     clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
//     hostManager:管理Server

// 显示当前系统用户
db.system.users.find()

// 删除用户的时候需要切换到用户管理的数据库才可以删除;
db.dropUser("admin")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦书翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值