MongoDB基础
文章目录
宝塔中的下载和连接
1.在宝塔面板的软件商店安装mongoDB
2.修改mongodb配置
将ip从127.0.0.1更改为0.0.0,并解除IP限制\
授权默认为禁用,如果需要授权验证,则改为启用(冒号后请保留空格) enable
3.宝塔释放端口27017 , 腾讯云服务器,开放端口27017
5.配置用户名和密码
mongo
use admin
db.createUser({user: "root",pwd: "password", roles: [ { role: "root", db: "admin" } ]})
// 进入自己的数据库,创建自己数据库的管理角色
use yourdatabase
db.createUser({user: "user",pwd: "password",roles: [ { role: "dbOwner", db: "yourdatabase" } ]})
验证用户,设置了权限验证之后,如果要查看用户信息,如show users,会显示没有权限,需要进行验证之前你创建的管理角色
// 验证用户必须在admin库中完成
db.auth('root','password')
MongoDB 相关概念
1. 应用场景
使用MongoDB可应对“三高”需求
- 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
- 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问
- 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能读取订单所有的变更
- 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
- 视频直播,使用 MongoDB 存储用户信息、点赞互动信息等
共同特点:
- 数据量大
- 写入操作频繁(读写都很频繁)
- 价值较低的数据,对事务性要求不高
2. 简介
MongoDB是一个开源、高性能、无模式的文档型数据库
“最像关系型数据库的 NoSQL 数据库”. MongoDB 中的记录是一个文档, 是一个 key-value pair. 字段的数据类型是字符型, 值除了使用基本的一些类型以外, 还包括其它文档, 普通数组以及文档数组
它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON
,所以它既可以存储比较复杂的数据类型
,又相当的灵活
。
Bson中,除了基本的JSON类型:string,integer,boolean,double,null,array和object,mongo还使用了特殊的数据类型。这些类型包括date,object id,binary data,regular expression 和code
MongoDB中的记录是一个文档
,它是一个由字段和值对(field:value)组成
的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象
在 MongoDB 中, 数据库和集合都不需要手动创建, 当我们创建文档时, 如果文档所在的集合或者数据库不存在, 则会自动创建数据库或者集合
- 数据库 (database)
- 数据库是一个仓库, 存储集合 (collection)
- 集合 (collection)
- 类似于数组, 在集合中存放文档
- 文档 (document)
- 文档型数据库的最小单位, 通常情况, 我们存储和操作的内容都是文档
SQL术语/概念 | MondoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
嵌入文档 | MongoDB通过嵌入式文档来替代多表连接 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
BSON数据类型参考列表:
数据类型 | 描述 | 举例 |
---|---|---|
字符串 | UTF-8字符串都可表示为字符串类型的数据 | {“x” : “foobar”} |
对象id | 对象id是文档的12字节的唯一 ID | {“X” :ObjectId() } |
布尔值 | 真或者假:true或者false | {“x”:true}+ |
数组 | 值的集合或者列表可以表示成数组 | {“x” : [“a”, “b”, “c”]} |
32位整数 | 类型不可用。JavaScript仅支持64位浮点数,所以32位整数会被自动转换。 | shell是不支持该类型的,shell中默认会转换成64位浮点数 |
64位整数 | 不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位整数 | shell是不支持该类型的,shell中默认会转换成64位浮点数 |
64位浮点数 | shell中的数字就是这一种类型 | {“x”:3.14159,“y”:3} |
null | 表示空值或者未定义的对象 | {“x”:null} |
undefined | 文档中也可以使用未定义类型 | {“x”:undefined} |
符号 | shell不支持,shell会将数据库中的符号类型的数据自动转换成字符串 | |
正则表达式 | 文档中可以包含正则表达式,采用JavaScript的正则表达式语法 | {“x” : /foobar/i} |
代码 | 文档中还可以包含JavaScript代码 | {“x” : function() { /* …… */ }} |
二进制数据 | 二进制数据可以由任意字节的串组成,不过shell中无法使用 | |
最大值/最小值 | BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型。 |
3. 特点
MongoDB主要有如下特点:
高性能
索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。(文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求、地理位置索引可用于构建各种 O2O 应用)
mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求
Gridfs解决文件存储的需求
高可用性
MongoDB的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余
高可扩展性
MongoDB提供了水平可扩展性作为其核心功能的一部分
分片将数据分布在一组集群的机器上。(海量数据存储,服务能力水平扩展)
从3.4开始,MongoDB支持基于片键创建数据区域。在一个平衡的集群中,MongoDB将一个区域所覆盖的读写只定向到该区域内的那些片
丰富的查询支持
MongoDB支持丰富的查询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等
MongoDB 常用命令
三个初始数据库
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
数据库 (databases) 管理语法
操作 | 语法 |
---|---|
查看所有数据库 | show dbs; 或 show databases; |
查看当前数据库 | db; |
切换到某数据库 (若数据库不存在则创建数据库) | use <db_name>; |
删除当前数据库 | db.dropDatabase(); |
集合 (collection) 管理语法
操作 | 语法 |
---|---|
查看所有集合 | show collections; |
创建集合 | db.createCollection("<collection_name>"); |
删除集合 | db.<collection_name>.drop() |
常用命令小结
命令 | 含义 |
---|---|
use articledb | 选择数据库 |
db.comment.insert({bson数据}) | 插入 |
db.comment.find(); | 查询所有 |
db.comment.find({条件}) | 条件查询 |
db.comment.findOne({条件}) | 查询符合条件的第一条记录 |
db.comment.find({条件}).limit(条数) | 查询符合条件的前几条记录 |
db.comment.find({条件}).skip(条数) | 查询符合条件的跳过的记录 |
db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:{要修改部分的字段:数据}) | 修改数据 |
db.comment.update({条件},{$inc:{自增的字段:步进值}}) | 修改数据并自增某字段值 |
db.comment.remove({条件}) | 删除数据 |
db.comment.count({条件}) | 统计查询 |
db.comment.find({字段名:/正则表达式/}) | 模糊查询 |
db.comment.find({字段名:{$gt:值}}) | 条件比较运算 |
db.comment.find({字段名:{值,值或字段名nin:[值1,值2]}}) | 包含查询 |
db.comment.find({条件条件或or:[{条件1},{条件2}]}) | 条件连接查询 |