广告
返回顶部
首页 > 资讯 > 数据库 >mongodb 基础入门教程
  • 346
分享到

mongodb 基础入门教程

mongodb基础入门教程 2015-07-29 01:07:10 346人浏览 无得
摘要

算是学习下来精炼的笔记,希望对大家有帮助。如果有问题欢迎大家指正。 0.概述 mongoDB 是由c++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MonGoDB 旨在为W

算是学习下来精炼的笔记,希望对大家有帮助。如果有问题欢迎大家指正。

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("索引名")
您可能感兴趣的文档:

--结束END--

本文标题: mongodb 基础入门教程

本文链接: https://www.lsjlt.com/news/3396.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mongodb 基础入门教程
    算是学习下来精炼的笔记,希望对大家有帮助。如果有问题欢迎大家指正。 0.概述 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为W...
    99+
    2015-07-29
    mongodb 基础入门教程
  • MongoDB基础入门
    简介 • MongoDB是为快速开发互联网Web应用而设计的数据库系统。 • MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分。 • MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,Mong...
    99+
    2021-02-07
    MongoDB基础入门
  • python入门基础教程
    Python是一门简单易学、功能强大的编程语言,适合初学者入门。下面是一个简要的Python入门基础教程,帮助您快速上手Python编程。1. 安装Python:首先,您需要在计算机上安装Python解释器。您可以从Python官方网站(h...
    99+
    2023-10-25
    python 入门 基础教程
  • SQL 教程-入门基础篇
    文章目录 SQL 简介SQL 语法SQL SELECT 语句SQL SELECT DISTINCT 语句SQL WHERE 子句SQL AND & OR 运算符SQL ORDER BY...
    99+
    2023-08-31
    sql 数据库 mybatis mysql
  • SQL 零基础入门教程
    目录一、了解 SQL二、检索数据三、排序检索数据四、过滤数据五、高级数据过滤六、用通配符进行过滤七、创建计算字段八、使用函数处理数据九、汇总数据十、分组数据十一、使用子查询十二、联结表十三、创建高级联结十四、组合查询十五、插入数据十六、更...
    99+
    2014-09-15
    SQL 零基础入门教程
  • Python pygame入门基础教程
    本篇文章给大家带来了关于Python的相关知识,大家都知道pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音,下面介绍了关于Python pygame新手入门基础教程的相关资料,希望对大家有帮助。【相关推荐:Python...
    99+
    2022-08-08
    python
  • Swaggo零基础入门教程
    目录配置流程注意区分下载swaggo初始化快速上手gin-swagger简单测试详细配置配置流程 注意区分 go-swagger != swaggo 二者功能差不多,都是生成接口文档...
    99+
    2023-01-28
    Swaggo入门 Golang Swaggo入门
  • EF Core基础入门教程
    EF Core 是一个ORM(对象关系映射),它使 .NET 开发人员可以使用 .NET对象操作数据库,避免了像ADO.NET访问数据库的代码,开发者只需要编写对象即可。 EF Co...
    99+
    2022-11-13
  • python入门基础教程10 pytho
    if分支语句分支语句的作用是在某些条件控制下有选择的执行实现一定功能语句块。if 分支语句则是当if后的条件满足时,if 下的语句块被执行,语法格式如下所示:if <condition>:     statements让我们看看...
    99+
    2023-01-31
    基础教程 入门 python
  • python入门基础教程09 pytho
    表达式表达式,是由数字、算符、数字分组符号括号、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合,故表示通常是由操作数和操作符两部分组成,如果操作符前后均有操作数,我们称此类操作符是双目运算符,例如加法、减法、取模、赋值运算等运算...
    99+
    2023-01-31
    基础教程 入门 python
  • python入门基础教程05 Pytho
    Python-Shell反馈常见错误初学者通常会使用Python-Shell来学习Python基础及语法知识,在使用Python-Shell 时会遇到这样或者那样的错误,有的是语法错误,有的是键入的函数或者变量名字拼写错误,现就初学者常出现...
    99+
    2023-01-31
    基础教程 入门 python
  • Leaflet基础入门教程示例
    目录什么是Webgis?什么是Leaflet?在Vue中安装Leaflet,与其他依赖在App.vue中使用初始化地图chinaProvider地图瓦片addControls使用工具...
    99+
    2023-01-04
    Leaflet 基础 Leaflet 入门教程
  • python入门基础教程02 Pytho
    02 Python简介Python简介Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,属于应用层软件。自从20 世纪90 年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务、自动化运维、图像处理游戏和We...
    99+
    2023-01-31
    基础教程 入门 python
  • HTML入门零基础教程(四)
    嗨,大家好,我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助,请支持一波。 希望未来可以一起学习交流。 通过前三篇的学习,相信你们对HTML有了一些基础的了解,那么我们就来先做一个小练习,巩固一下之前所学习的知识。 目...
    99+
    2023-08-31
    html 前端 css javascript vscode
  • MySQL基础入门教程之事务
    目录引言1、事务操作1.1 未控制事务1.2 控制事务一1.3 控制事务二2、事务的四大特性3、并发事务问题4、事务隔离级别总结引言 事务是一组操作的集合,它是一个不可分割的工作单位...
    99+
    2022-11-13
  • Python学习入门基础教程(learn
     在Python里可以自定义函数,实现某特定功能,这里首先要区分一下函数的定义和函数的调用两个基本概念,初学者往往容易混淆。      函数的定义是指将一堆能实现特定功能的语句用一个函数名标识起来,而函数的调用则是通过函数名来使用这一堆语句...
    99+
    2023-01-31
    基础教程 入门 Python
  • SQL 入门教程:数据库基础
    目录一、数据库二、表三、列和数据类型四、行五、主键请参阅 目录汇总:SQL 入门教程:面向萌新小白的零基础入门教程 你正在读本 SQL 教程,这表明你需要以某种方式与数据库打交道。SQL 正是用来实现这一任务的语言,因此在学习 SQL 之...
    99+
    2017-01-19
    SQL 入门教程:数据库基础
  • Vue全家桶入门基础教程
    目录1. Vue概述 2. Vue的基本使用2.1 传统开发模式对比2.2 Vue.js之HelloWorld基本步骤2.3 Vue.js之HelloWorld细节分析3....
    99+
    2022-11-12
  • Python pygame新手入门基础教程
    目录pygame简介pygame实现窗口设置屏幕背景色添加文字绘制多边形绘制直线绘制圆形绘制椭圆绘制矩形总结pygame简介 pygame可以实现python游戏的一个基础包。 py...
    99+
    2022-11-11
  • Python学习入门基础教程(lear
      在if分支判断语句里的条件判断语句不一定就是一个表达式,可以是多个(布尔)表达式的组合关系运算,这里如何使用更多的关系表达式构建出一个比较复杂的条件判断呢?这里需要再了解一下逻辑运算的基础知识。逻辑关系运算有以下几种运算符.     ...
    99+
    2023-01-31
    基础教程 入门 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作