mongodb 基础入门教程
算是学习下来精炼的笔记,希望对大家有帮助。如果有问题欢迎大家指正。
0.概述
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
下面是与sql概念的对比。能够帮助我们更好的理解mongodb。
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 表连接,MongoDB不支持 | |
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
总结下来,传统的关系型数据库的内容结构是
- 数据库
- 表
- 行
- 字段
Mongodb与之对应的就是
- 数据库
- 集合
- 文档
- 域
1.brew安装
不推荐用brew,因为现在mongodb闭源了,brew里已经搜索不到mongodb,不过还是可以用brew安装的,这篇就不写了。
2.官网下载
直接去官网下载一个zip,解压完放到usr/local/里(control+shift+。可以显示隐藏文件夹),改名为mongodb。
然后添加一个环境变量就可以用了
$ export PATH=/usr/local/mongodb/bin:$PATH
这样就添加好了,反正就是现在可以用了。
可以用mongo来测试是否安装好了,如果都弄好了应该会弹出版本。
3.创建data/db文件夹
接下来就是新建data/db然后运行mongodb的步骤了。
不过mac os catalina现在有问题,跟目录不让写东西了,所以要曲线救国,根据mongodb给的最新的解决办法就是在/Users/(你的用户名)/data/db/里当目录了
最后带上--dbpath= ,如果不添加会默认到/data/db里
sudo mongod --dbpath=/Users/Wangzirui/data/db
如果不是卡特琳娜那好说,
sudo mkdir -p /data/db 然后 sudo mongod 就完事了。
更改catelina限制之后(关闭sip)。可以直接用 sudo mount -uw / 更改跟目录权限,就可以直接sudo mongod就完事了。
然后另一个终端进入/usr/loacl/mongodb/bin/
然后./mongo就启动了mongo的客户端
或者直接mongo也可以。
4.开启服务创建客户端
启动服务:
sudo mount -uw /
sudo mongod
启动客户端:
mongo
5.命令
5.1 db操作
显示数据库
- show dbs
切换数据库,没有就新建一个
- use admin
显示你在哪个数据库里
- Db
删除当前你use的那个数据库
- db.dropDatebase()
新建数据库
- use 数据库名字
- 建完了show dbs不会立刻显示,因为刚才新建的数据库里面没有数据。所以显示不出来。
5.2 collection操作
显示这个数据库中有什么集合
- show collections
新建集合,在use 一个数据库的情况下
- db.createCollections(name,options)
- 然后show dbs现在可以看到use的数据库了
删除集合 ,在现在这个Use的数据库的情况下
- db.你想要的collectionname.drop()
- 然后就删掉了
5.3 document操作
collectionname代指相对应的collcetion名字(mysql里叫表,Mongodb里叫collection,都是一个数据库里的一种结构) 现在操作的不是表也不是集合,而是集合里的一个数据结构叫做document,文档,文档相当于mysql里的一个记录行。
往collection里加数据,直接新建document
- db.collectionname.insert({"name":"wangzirui"})
- 增加多条要在insert的多个对象的外面加一个中括号,表示这是一个对象数组。
- db.collectionname.insert([{name:"wangzirui"},{name:"laoli"}])
查看collection里的数据
- db.collectionname.find()
Save,在_id一样的情况下可以不报错,然后直接覆盖掉刚才重复Id的内容。
- db.collectionsname.save({_id:1001,name:"laowang",age:22})
更新document数据
- db.collectionname.update({当前数据},{替换数据},{配置项})
- db.collectionname.update({name:"laotie"},{name:"ergou"})
- 这样会删除其他内容,只存在一个name :ergou 所以要加$set保留其他的参数
- db.collectionname.update({name:"laotie"},{$set:{name:"ergou"}})
- 配置项里加{Multi:true}加一个这个的话可以让多个name:"laotie"一起改
- db.collectionname.update({name:"laotie"},{$set:{name:"ergou"}},{multi:true})
删除document内容,如果不加第二个参数,默认是把集合里的符合第一条的都删掉。
- Db.collectionname.remove({name:"laotie"},{justOne:true})
5.4 document 查询
经过上面的讲述,能了解到一点,基于database来查询collections里的数据都是通过db.collcetion_name.方法 来进行操作的,同理。对document的查询,我们之前也在查看collection时用过,他就是find()方法。
find里面可以加参数,不加的话就是现实collection里所有的document。
find()方法里可以加条件,例如db.collectionname.find({age:18})
- 如果一行一行的话不好看,可以再db.collectionname.find({age:18})后面加.pretty()
比较运算符
- less than 小于 $lt db.collection_name.find(age:{$lt:18})
- less than equal 小于等于 $lte
- Geater than 大于 $gt
- $gte 大于等于
- $ne 不等于
取范围内的 $in
- $in:[10,20,30]
- db.collection_name.find({age:{$in:[10,20,30]}})
并操作
- db.collection_name.find(age:18,name:"laotie")
或操作
- db.collection_name.find({$or:[{age:18},{name:"laotie"}]}
正则
- db.collection_name.find({age:/1/})或者db.collection_name.find({age:$regex:"1"})
限制和跳过,一般用于分页
- limit(2)
- skip(2)
投影
- 比如说find({这里放具体参数},{这里放投影})
- db.collection_name.find({age:{$lt:18}},{_id:0,age:1}) 这样只会显示每个对象里面只有一个age选项了
- 注意,如果投影里不加_id的选项的话 ,默认是自动显示的。只能给_id设置 0。如果别的字段不想让他显示直接不在里面加。其他的想要显示的话直接把属性加进去就行了。
通过Js函数来筛选数据
$where:
db.collection_name.find({$where:function(){
Return age>10}})
根据某个字段排序
- sort
- db.collection_name.find().sort({age:1}) 如果降序的话要带-1
计数
count()
直接在查询出来的后面加上就可以显示了
db.collection_name.find({$where:function(){
Return age>10}}).count()
去重
- db.student.distinct("name",{"age" : 18})
- 这样可以直接把name一样还有age为18的都给去重
6.备份和恢复
6.1备份
直接在终端输入,不要在mongodb的客户端输入
mongodump -h hostname -d dbname -o dbdirectory
-h 服务器地址,可以指定端口号。本机可以不填
-d 具体Mongodb下哪个数据库
-o 你想保存到本地的什么地方
例如本机 下在termainal直接输入 mongodump -d laotie -o wenjianjia
然后就把 laotie这个数据库保存到Users/wangzirui/wenjianjia这个文件夹里了
6.2恢复
同样直接在终端输入
Mongorestore -h hostname -d dbname --dir
-h 服务器地址,可以指定端口号。本机可以不填
-d 你想让这个数据库叫什么,不一定是原名
-Dir 这个备份文件在哪里
7.聚合
aggregate,就是一个管道,类似中间件或者是函数的链式调用。最终导出想要的数据。
7.1group
首先放一个student集合的数据,聚合所有的操作都是按照这些数据来的。
> db.student.find()
{ "_id" : ObjectId("5e003b92f197cb08dc74a311"), "name" : "duanyuxin", "age" : 21, "sex" : "male" }
{ "_id" : ObjectId("5e003b92f197cb08dc74a312"), "name" : "baiyu", "age" : 20, "sex" : "male" }
{ "_id" : ObjectId("5e003f66f197cb08dc74a313"), "name" : "wangzirui", "age" : 22, "sex" : "male" }
{ "_id" : ObjectId("5e003f8ff197cb08dc74a314"), "name" : "zhuhuan", "age" : 22, "sex" : "female" }
{ "_id" : ObjectId("5e003f8ff197cb08dc74a315"), "name" : "caoyajing", "age" : 12, "sex" : "female" }
先放例子:
> db.student.aggregate({
$group:{_id:"$sex",avg_age:{$avg:"$age"}}
})
{ "_id" : "male", "avg_age" : 21 }
{ "_id" : "female", "avg_age" : 17 }
在$group的对象里,前面开头的域(字段)代表下面将要输出的域的值。 后面的$sex表示的是我拿什么东西当做group分组的键值。如果我针对不同的age分组,那么我将会得到
> db.student.aggregate({
$group:{_id:"$age"}
})
{ "_id" : "12"}
{ "_id" : "20"}
{ "_id" : "21"}
{ "_id" : "22"}
的结果。
接着说avg_age,这个域是我们自己定义的。(可能是先入为主,我总觉得说字段更为适应,大家也更容易理解),叫什么都行,但是后面$avg:"$age"的意思就是,首先前面$avg就是取平均值,取得就是你后面$age的平均值。然后输出的时候就打印"avg_age:前面符合id分类的文档的age平均值"
如果想计算整个文档的某些值,仅需要把_id:null然就可以不分组,直接用整个文档来算。
> db.student.aggregate({
$group:{_id:null,avg_age:{$avg:"$age"}}
})
{ "_id" : null, "avg_age" : 19.4 }
$sum:
另外讲一个$sum的用法,先看怎么用。
> db.student.aggregate({
$group:{_id:null,count:{$sum:1},avg_age:{$avg:"$age"}}
})
{ "_id" : null, "count" : 5, "avg_age" : 19.4 }
在刚才的基础上加了一个$sum:1里 $sum顾名思义是求和用的,后面是求和的倍数,如果你设成2的话结果就乘2变成10.一般用来计数的话普遍还是设置成1的。
利用$group去重:
$group不止可以添加一个分组条件,也可以添加多个分组条件,如果把每个条件都对应文档的域,那么就相当于去重操作。
> db.student.aggregate({
$group:{_id:{name:"$name",sex:"$sex",age:"$age"}}
})
然后接下来用别的通道来进行下一步的操作就可以了。但是接下来的操作要用到的属性就是$_id.name 类似的。因为我们去重时把属性都给了叫_id的域。
7.2$project
重构输出结构,也就是在aggregete的通道特性,然在最后调整你想要的输出结构。大体上和投影类似。
放栗子:
> db.student.aggregate(
{
$group:{_id:null,count:{$sum:1},avg_age:{$avg:"$age"}}
},
{
$project:{sex:"$_id",count:"$count",avg_age:"$avg_age"}
}
)
{ "_id" : null, "sex" : null, "count" : 5, "avg_age" : 19.4 }
同理,可以用1 或者0代替。具体不举例子了,没什么大用。
7.4 $match
听名字就知道是过滤用的,虽然find同样可以过滤,但是不能将find出来的结果传给下一个管道。
比如说你想呀知道年龄大于20的男生和女生分别有几个人
可以按照下面的方式操作
db.student.aggregate(
{$match:{age:{$gt:19}}},
{$group:{_id:"$sex",count:{$sum:1}}},
{$project:{_id:0,sex:"$_id",count:1}}
)
{ "count" : 3, "sex" : "male" }
{ "count" : 1, "sex" : "female" }
大体就是这样,里面填的东西和find里是差不多的。
7.5 $sort
用法跟普通的用法一致,直接放栗子:
db.student.aggregate(
{$group:{_id:"$sex",count:{$sum:1}}},
{$sort:{age:1}}
)
{ "_id" : "female", "count" : 2 }
{ "_id" : "male", "count" : 3 }
如果前面的其他方法都看懂了,这个应该不成问题。就不解释了。
7.6 $limit,skip
同样跟前面很像,直接放例子:
db.student.aggregate(
{$skip:2},{$limit:2}
)
{ "_id" : ObjectId("5e003f66f197cb08dc74a313"), "name" : "wangzirui", "age" : 22, "sex" : "male" }
{ "_id" : ObjectId("5e003f8ff197cb08dc74a314"), "name" : "zhuhuan", "age" : 22, "sex" : "female" }
不解释了。
8.创建索引
for(i=0;i<100000;i++){db.test.insert({name:'test'+i,age:i})}
在数据量特别庞大的时候,寻找数据就会变得慢一点。
所以要针对性的给集合建立索引
db.test.ensureIndex({name:1})
然后这个集合就有两个索引了,之前那个索引叫_id,现在添加了一个域name也作为索引。
关于索引的几个操作:
- 创建唯一索引
- db.test.ensureIndex({name:1},{uniqe:true})
- 建立联合索引
- db.test.ensureIndex({name:1},{age:1})
- 查看当前集合的索引
- db.test.getIndexes()
- 删除索引
- db.t1.dropIndex("索引名")
mongodb 基础入门教程的更多相关文章
- Mongodb最基础入门教程
Mongodb最基础入门教程 如果想了解一下redis的入门教程,可以去看一下我的上一篇博客 Mongodb的安装大家可以参考一下其他博主的博客,这里我就不做介绍了.不过值得注意的是,在Linux ...
- [置顶] IOS 基础入门教程
IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...
- Python基础入门教程
Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...
- MongoDb 快速入门教程
文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...
- 在.Net Core中使用MongoDB的入门教程(二)
在上一篇文章中,讲到了MongoDB在导入驱动.MongoDB的连接,数据的插入等. 在.Net Core中使用MongoDB的入门教程(一) 本篇文章将接着上篇文章进行介绍MongoDB在.Net ...
- 在.Net Core中使用MongoDB的入门教程(一)
首先,我们在MongoDB的官方文档中看到,MongoDb的2.4以上的For .Net的驱动是支持.Net Core 2.0的. 所以,在我们安装好了MangoDB后,就可以开始MangoDB的.N ...
- React Native基础&入门教程:初步使用Flexbox布局
在上篇中,笔者分享了部分安装并调试React Native应用过程里的一点经验,如果还没有看过的同学请点击<React Native基础&入门教程:调试React Native应用的一小 ...
- Linux基础入门教程
Linux基础入门教程 --------- Linux学习路径 Linux学习者,常常不知道自己改怎么学习linux:Linux初级,也就是入门linux前提是需要有一些计算机硬件相关的知识或是有一下 ...
- MongoDB基础入门视频教程
MongoDB基础入门视频教程http://www.icoolxue.com/album/show/98
随机推荐
- 11--Java--JDBC知识梳理
JDBC 一.概述:JDBC(java database connection),使用java语言连接数据库,是java提供一套操作数据库的接口(标准),实现对数据库的统一访问,是一个java引用应用 ...
- C++中STL库函数的基本运用
学了这么长时间的STL库,现在我觉得是有必要对过去的题目和所遇到的问题做一下整理了,以便于之后更好的展开练习: 一. 为什么要用STL库? 1.简单粗暴(省事). 2.便于解决复杂的问题(在贪心题目中 ...
- JVM解毒——类加载子系统
带着问题,尤其是面试问题的学习才是最高效的.加油,奥利给! 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 直击面试 看你简历写得熟悉JVM,那你说说 ...
- 数据算法 --hadoop/spark数据处理技巧 --(1.二次排序问题 2. TopN问题)
一.二次排序问题. MR/hadoop两种方案: 1.让reducer读取和缓存给个定键的所有值(例如,缓存到一个数组数据结构中,)然后对这些值完成一个reducer中排序.这种方法不具有可伸缩性,因 ...
- 准备 Python3 和 Python 虚拟环境
1.安装依赖包 yum -y install wget gcc epel-release git 2.安装 Python3.6 yum -y install python36 python36-dev ...
- Windows更改、自定义键盘功能键
为什么要改? 使用mac盘习惯之后回到Windows感觉实盘使用起来很是别扭,所以... 开始行动 新建一个.reg后缀的文件,文件名称随意,编辑输入一下内容:(以下内容是把键盘左侧的CTRL和ALT ...
- 11种常用css样式之鼠标、列表和尺寸样式学习
鼠标cursor常见样式crosshair;/*十字形状*/cursor:pointer;/*小手形状*/cursor:wait;/*等待形状*/cursor:text;/*默认 文本形状*/curs ...
- 1.4掌握日志工具的使用——Android第一行代码(第二版)笔记
Android中的日志工具类是Log(android.util.Log),这个类中提供了如下5个方法来供我们打印日志. Log.v():用于打印那些最为琐碎的.意义最小的日志信息.对应级别verbos ...
- MR25H40非易失性串行接口MRAM
Everspin 是设计,制造和商业销售离散和嵌入式磁阻RAM(MRAM)和自旋传递扭矩MRAM(STT-MRAM)的全球领导者,其市场和应用领域涉及数据持久性和完整性,低延迟和安全性至关重要.Eve ...
- linux下(centos7)docker安装
参考链接https://docs.docker.com/install/linux/docker-ce/centos/ 第一步,确定是centos7及以上版本 cat /etc/redhat-rele ...