MongoDB 基础(2019年开篇)
MongoDB基础知识:
1、什么是MongoDB
NoSQL(NoSQL=Not Only SQL),意即"不仅仅是SQL"。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 MongoDB是由C++编写的,MongoDB语法类似JS,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储为一个文档,数据结构由键值对(key=>value)组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。 示例:
{
name: "wangchunwang",
age: 26,
groups: ["news", "sports"]
}
假设上述文档所在的集合是testcoll,那么以下几种查询键值方法等效:
> db.testcoll.findOne().name // 点链式访问
> db["test"].findOne()["name"] // 数组式访问 2、进入MongoDB Shell
在cmd中输入 > mongo [ip:port/database -u username -p] 查看当前操作的数据库:> db
显示所有数据库:> show dbs
连接到指定的数据库:> use db_name // 不存在,则新建之 有一些数据库名是保留的:
admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。 创建用户(用户是基于数据库的):
> use test // 先切换到某个数据库,再创建用户
> db.createUser({
user: "root",
pwd: "root",
roles: [{ role: "dbAdmin", db: "test" }] // 常用角色:read、readWrite、dbAdmin、root / readAnyDatabase、readWriteAnyDatabase、dbAdminAnyDatabase
}) 修改用户密码:> db.changeUserPassword(username, password)
授权用户角色:> db.grantRolesToUser(username, roles [,writeConcern])
删除用户:
> use test // 需要先切换到该数据库,否则删除不成功
> db.dropUser(username) 3、Mongo中的一些概念
--------------+------------------------+-------------------------------------------
SQL术语/概念 MongoDB术语/概念 解释/说明
--------------+------------------------+-------------------------------------------
database database 数据库
--------------+------------------------+-------------------------------------------
table collection 数据库表/集合
--------------+------------------------+-------------------------------------------
row document 数据记录行/文档
--------------+------------------------+-------------------------------------------
column field 数据字段/域
--------------+------------------------+-------------------------------------------
index index 索引
--------------+------------------------+-------------------------------------------
table joins 表连接,MongoDB不支持
--------------+------------------------+-------------------------------------------
primary key primary key 主键,MongoDB自动将"_id"字段设置为主键
--------------+------------------------+------------------------------------------- ObjectId:类似唯一主键,包含12个字节:
前4个字节表示创建unix时间戳,接下来的3个字节是机器标识码,紧接的2个字节是进程id,最后3个字节是随机数。 由于ObjectId中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,可以通过"getTimestamp()"来获取文档的创建时间戳:
ObjectId("5c263a0a1968ec6c090e57fd").getTimestamp() // 返回时间戳
ObjectId("5c263a0a1968ec6c090e57fd").str // 返回字符串 MongoDB无须声明数据类型,全自动匹配。 4、创建数据库
> use db_name
名称通常小写。
MongoDB中默认的数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中。 5、删除数据库
首先连接到要删除的数据库:
> use db_name
> db.dropDatabase() 6、创建集合
> db.createCollection(name [,options])
名称通常小写。
options参数说明:
capped:如果为 true 或 1 ,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
size:当capped为true时须指定该参数值,固定集合最大值。单位:KB。
max:可选,固定集合最大文档数。单位:个。 7、删除集合
> db.collection_name.drop() 8、插入文档
> db.collection_name.insert({key: value, ...})
文档的数据结构和JSON基本一样。 9、更新文档
> db.collection_name.update(query, update [,options])
参数说明:
query:查询条件。例{name: "wangchunwang"}。
update:更新操作符(如$set,$unset,$inc等原子操作,$unset是移除键值对)。例{$set: {name: "wcwnina"}}、{$unset: {salary: 1}}。
options参数说明:
upsert:布尔型,查无结果是否插入文档。默认false。
multi:布尔型,是否更新全部查询结果。默认false。 > db.collection_name.save(document) // 替换整个文档 10、删除文档
> db.collection_name.remove([query, options])
参数说明:
query:查询条件。
options参数说明:
justOne:布尔型,是否只删除一条。默认false。 11、查询文档
> db.collection_name.find([query, projection])
参数说明:
query:查询条件。
projection:返回指定的键,true或1返回,false或0不返回。例{name: 1, salary: 1}。 格式化显示结果:
> db.collection_name.find().pretty() AND条件:
MongoDB的find()方法可以传入多个键,每个键以逗号隔开,即常规SQL的AND条件。
OR条件:
MongoDB的OR条件语句使用了操作符$or。如:> db.collection_name.find({$or: [{key1: value1}, {key2: value2}]}) 关系比较符:
小于:$lt
小于或等于:$lte
大于:$gt
大于或等于:$gte
不等于:$ne
属于:$in
例> db.collection_name.find({salary: {$lt: 10000, $gt: 5000}})。 // 5000<salary<10000 模糊查询:使用JS正则表达式。
> db.collection_name.find({name: /wangchunwang/}) // 包含
> db.collection_name.find({name: /^wangchunwang/}) // 以...开头
> db.collection_name.find({name: /wangchunwang$/}) // 以...结尾 limit(number)方法:限制读取文档数量。
skip(number)方法:开头跳过的文档数量。效率很差,影响查询速率。
skip()和limit()组合能实现分页。
例> db.collection_name.find().skip(1).limit(10) // 跳过第一个,从第二个开始,查询10个文档 排序sort():
> db.collection_name.find().sort({key: 1或-1}) // 1升序,-1降序 总结:skip(),limilt(),sort()三个放在一起执行的时候,执行的顺序是先sort(),然后是skip(),最后是显示的limit()。 12、创建索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的。
索引可以级联,即可以为子文档的键创建索引。 > db.collection_name.createIndex({key: 1或-1} [,options]) // 1升序索引,-1降序索引
options参数说明:
name:索引的名称。如果未指定,通过连接索引的键名和排序顺序生成一个索引名称。
unique:建立的索引是否唯一。若为true或1则创建唯一索引,那么该键的值唯一。默认值为false。 查看集合索引:
> db.collection_name.getIndexes()
查看集合索引大小:
> db.collection_name.totalIndexSize()
删除集合指定索引:
> db.collection_name.dropIndexes(index_name)
删除集合所有索引:
> db.collection_name.dropIndex() 13、聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。 > db.collection_name.aggregate(operations)
$sum 计算总和。
$avg 计算平均值。
$max 获取集合中所有文档对应值的最大值。
例> db.collection_name.aggregate({$group: {_id: 0, total: {$sum: "$salary"}}}) // _id的值为分组依据,total为自定义键,$为引用某个键 14、MongoDB复制(replSet)
MongoDB复制是将数据【实时】同步在多个服务器上。
MongoDB复制需要主从节点,主节点负责处理客户端请求,其余都是从节点,负责复制主节点上的数据。
各个节点常见的搭配方式为:一主一从、一主多从。 副本集特征:
a)N个节点的集群;
b)所有写入操作都在主节点上;
c)主从实时复制,任何节点可作为主节点;
d)自动故障转移和恢复,高可用性。 具体操作(略) 15、MongoDB分片(shard)
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
三个主要组件:
Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组一个replica set承担,防止主机单点故障
Config Server:mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。 16、MongoDB备份(mongodump)与恢复(mongorestore)
备份:使用mongodump命令导出所有数据到指定目录中。
> mongodump -h host -p port -d db_name -o bakdir
例:mongodump -h 127.0.0.1 -p 27017 -d test -o E:\bakdata
参数说明:
-h:MongDB所在服务器IP。
-p:MongDB所在服务器端口。
-d:需要备份的数据库实例。
-o:备份的数据存放位置。 恢复:使用mongorestore命令来导入备份的数据。
> mongorestore -h host -p port -d db_name bakpath
例:mongorestore -h 127.0.0.1 -p 27017 -d test E:\bakdata\test 17、MongoDB监控
MongoDB中提供了mongostat和mongotop两个命令来监控MongoDB的运行情况。
mongostat [seconds]命令:状态检测工具。
mongotop [seconds]命令:每个集合的读写时间统计。 18、MongoDB查询分析
询分析常用函数:explain()
> db.collection_name.find({name: "wangchunwang"}).explain() 19、MongoDB关系
引用式关系是设计数据库时经常用到的方法,通过引用文档的_id字段来建立关系。 例{
adress_id: {
$ref: "collection_name", // 引用的集合
$id: ObjectId("5c263a0a1968ec6c090e57fd"), // 引用的文档_id
$db: "db_name" // 引用的数据库
}
} 19、原子操作常用命令
$set
用来指定一个键并更新键值,若键不存在并创建。
{ $set: { key: value } } $unset
用来删除一个键。
{ $unset: { key: 1} } $inc
对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
{ $inc: { key: value } } $push
把value追加到key里面去,key一定要是"数组"类型才行,如果key不存在,会新增一个"数组"类型加进去。
{ $push: { key: value } } $pull
从"数组"key内删除一个等于value值。
{ $pull: { key: value } } $addToSet
增加一个值到"数组"内,而且只有当这个值不在"数组"内才增加(不重复增加)。 $pop
删除"数组"的最后一个或第一个元素。
{ $pop: { key: 1 } } // 1是最后一个,-1是第一个 $rename
修改键名称。
{ $rename: { old_key_name: "new_key_name" } } 20、MapReduce
详见:https://www.cnblogs.com/wcwnina/p/9494706.html 21、全文索引
给文档的多个键建立text全文索引后,就可以在整个集合中根据关键字搜索出文档。
关键字是单词,对中文支持很差。 创建全文索引:
> db.collection_name.createIndex({key1: "text", key2: "text"})
使用全文索引:
> db.collection_name.find({$text: {$search: "keyword1 keyword2"}) // 多个关键字用空格或逗号隔开 22、正则表达式
正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。与JS正则表达式语法一致。 直接使用正则表达式:
> db.collection_name.find({key: {$regex: /mongo/i}) // 采用$regex操作符。i忽略大小写,m多行匹配
以上查询也可以写为:
> db.collection_name.find({key: /mongo/i}) // 直接采用JS正则表达式
待续。。。
MongoDB 基础(2019年开篇)的更多相关文章
- mongodb基础用法
安装部分 mongodb配置方法 mongodb的安装目录 C:\MongoDB\Server\3.2\bin 创建以下目录 c:\mongo\log c:\mongo\db 创建mongodb的配置 ...
- mongodb基础系列——数据库查询数据返回前台JSP(一)
经过一段时间停顿,终于提笔来重新整理mongodb基础系列博客了. 同时也很抱歉,由于各种原因,没有及时整理出,今天做了一个demo,来演示,mongodb数据库查询的数据在JSP显示问题. 做了一个 ...
- MongoDB基础知识 02
MongoDB基础知识 02 6 数据类型 6.1 null : 表示空值或者不存在的字段 {"x":null} 6.2 布尔型 : 布尔类型只有两个值true和false {&q ...
- MongoDB基础知识 01
MongoDB基础知识 1. 文档 文档是MongoDB中的数据的基本单元,类似于关系型数据库管理系统的行. 文档是键值对的一个有序集.通常包含一个或者多个键值对. 例如: {”greeting& ...
- MongoDB基础教程系列--未完待续
最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...
- DataBase MongoDB基础知识记录
MongoDB基础知识记录 一.概念: 讲mongdb就必须提一下nosql,因为mongdb是nosql的代表作: NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型 ...
- MongoDB基础学习
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- windows下mongodb基础玩法系列二CURD附加一
windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...
- windows下mongodb基础玩法系列二CURD操作(创建、更新、读取和删除)
windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...
随机推荐
- 企业级镜像仓库harbor搭建
企业级镜像仓库harbor搭建 一. Harbor概述 VMware公司最近开源了企业级Registry项目Harbor,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服 ...
- 委托与lambda关系
什么是委托委托是没有方法体的,声明委托就是一个关键字: delegate ,委托可以试有参无参,有返回值无返回值.和我们的方法是一样的.不同的区别是 委托没有方法体的,委托可放在类下也可以放在类的外面 ...
- 联发科AIoT平台i500处理器简介
i500是一款强大而高效的AIoT平台,专为便携式.家用或商用物联网应用而设计,这些应用需要大量的边缘处理.先进的多媒体功能.多台高分辨率相机.相连的触屏显示器和多任务操作系统. 该平台集成了Arm ...
- 一个非常简单的IMPDP事儿
EXPDP出来的DMP文件包含2个Schema的表,现在要IMPDP到一个Schema里面试了几把都报错,好久不用逻辑导出入,折腾了好久,出现各种错误1.创建目录并授权create or replac ...
- Oracle 18c 数据库中scott用户不存在的解决方法
Oracle 18c 数据库中scott用户不存在的解决方法 注:该文为转载 上面标题可直接跳转 原文地址:http://www.cnblogs.com/zangdalei/p/5482732.htm ...
- 关于.Net mvc 项目在本地vs运行响应时间过长无法访问时,解决方法!
最近可能是刚升级了电脑使用了window10操作系统,总是遇到了一些以前没有遇到过的事情! 今早来到公司本来准备写bug的,但是当我打开vs运行的时候发现今天的电脑响应的时间明显的要比之前打开网页调试 ...
- 面向对象(__str__和__repr__方法)
#Author : Kelvin #Date : 2019/1/21 16:19 class App: def __init__(self,name): self.name=name # def __ ...
- Java中食之无味弃之可惜的数组
在Java的泛型出现之前,只有数组可以用来存储指定类型的对象:在自动装箱机制出现之前,只有数组可以用来存储基本数据类型:也就是说,在泛型和自动装箱机制出现之前,数组在Java当中的分量举足轻重. 况且 ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- Windows Server 2019 容器化探索-Docker安装
Docker on Windows Server 2019 微软自Windows Server 2016开始支持Docker,今天我们将介绍在Windows Server 2019上安装并使用Dock ...