mongodb数据库入门到精通看这一篇就够了(代码片段)

袁袁袁袁满 袁袁袁袁满     2023-04-07     594

关键词:

文章目录

一、MongoDB简介

1、MongoDB介绍

MongoDB是为快速开发互联网Web应用而设计的数据库系统。

MongoDB的设许目标是极简、灵活、作为Web应用栈的一部分。

MongoDB的数据模型是面向文档的, 所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON。( BSON )

2、MongoDB中三个概念

数据库( database ):数据库是一个仓库,在仓库中可以存放集合。

集合( collection ):集合类似于数组,在集合中可以存放文档。

文档( document ):文档数据库中的最小单位,我们存储和操作的内容都是文档。

3、MongoDB优势

易扩展: NoSQL数据库种类繁多, 但是⼀个共同的特点都是去掉关系数据库的关系型特性。 数据之间⽆关系, 这样就⾮常容易扩展

⼤数据量, ⾼性能: NoSQL数据库都具有⾮常⾼的读写性能, 尤其在⼤数据量下, 同样表现优秀。 这得益于它的⽆关系性, 数据库的结构简单

灵活的数据模型: NoSQL⽆需事先为要存储的数据建⽴字段, 随时可以存储⾃定义的数据格式。 ⽽在关系数据库⾥, 增删字段是⼀件⾮常麻烦的事情。 如果是⾮常⼤数据量的表, 增加字段简直就是⼀个噩梦

二、环境搭建

1、下载

官网下载地址:https://www.mongodb.com/try/download


注意:在MongoDB版本的版本偶数版为稳定版通常用于生产环境,如3.2.x、3.4.x、3.6.x,奇数版本为开发版本:3.1.x、3.3.x、3.5.x表示开发版

2、安装

点击开始安装


3、安装失败问题解决

在安装MongoDB数据库的时候,有可能出现安装速度较慢,然后取消安装以后,再一次重新去安装的时候,在安装的最后一步可能会出现无法启动服务的现象

这种情况直接点击Ignore,完成安装以后

以管理员身份运行命令行窗口,使用该命令将MongDB服务删除掉

sc delete MongoDB

删除以后我们自己在data目录下创建一个db文件夹log目录下创建一个MongoDB.log文件,如下:

重新装一个MongoDB服务就可以了,在安装目录的bin中打开控制台窗口输入命令:

mongod --dbpath=F:\\mongodb\\data\\db  --logpath=F:\\mongodb\\log\\MongoDB.log --install --serviceName "MongoDB"

注意:第一个路径表示的是数据存放地址;第二个路径表示日志存放文件
如图所示:

再输入 net start MongoDB启动服务

执行结果如下图:

设置环境变量

设置完毕后,需要重启一下电脑
在cmd控制输入,mongod -version,出现版本号表示安装成功

4、启动

cmd控制输出: mongo回车,出现大于符号表示进入MongoDB数据库了

5、图形化工具

1)下载

官网下载地址(英文版,试用14天)https://www.mongodbmanager.com/download ( 傻瓜式安装,一路next到完成即可)

2)连接客户端

1、确保mongodb已经启动

2、如果没有特别设置账户权限,默认情况下无需修改新建连接信息

3)基本操作

1、点击+展开数据库集合

2、输入sql语句

3、操作集合


4、集合其他操作

选择集合并右击

三、基础入门

1、基础命令

  • 查看所有的数据库:show dbs /show databases
  • 切换数据库:use db_name
  • 查看使用当前的数据库:db
  • 删除当前的数据库:db.dropDatabase()
  • 查看数据库中所有集合(表):show collections
  • 查看指定集合下所有文档(JSON数据):db.集合名称.find()

2、集合命令

不手动创建集合向不存在的集合中第⼀次加⼊数据时, 集合会被创建出来

手动创建结合

  • db.createCollection(name,options)

  • db.createCollection("stu")

  • db.createCollection("sub", capped : true, size : 10 )

  • 参数capped: 默认值为false表示不设置上限,值为true表示设置上限

  • 参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节

查看集合show collections

删除集合db.集合名称.drop()

3、数据类型

数据类型介绍
Object ID⽂档ID
String字符串, 最常⽤, 必须是有效的UTF-8
Boolean存储⼀个布尔值, true或false
Integer整数可以是32位或64位, 这取决于服务器
Double存储浮点值
Arrays数组或列表, 多个值存储到⼀个键
Object⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档
Null存储Null值
Timestamp时间戳, 表示从1970-1-1到现在的总秒数
Date存储当前⽇期或时间的UNIX时间格式

4、注意点

创建⽇期语句如下 :参数的格式为YYYY-MM-DD

new Date('2017-12-20')

每个⽂档都有⼀个属性, 为_id, 保证每个⽂档的唯⼀性

可以⾃⼰去设置_id插⼊⽂档,如果没有提供, 那么MongoDB为每个⽂档提供了⼀个独特的_id, 类型为objectID

objectID是⼀个12字节的⼗六进制数

  • 前4个字节为当前时间戳
  • 接下来3个字节的机器ID
  • 接下来的2个字节中MongoDB的服务进程id
  • 最后3个字节是简单的增量值

5、插入数据

语法如下

  • db.集合名称.insert(JSON对象)

  • 插入1条数据:db.集合名称.insertOne(JSON对象)

  • 插入多条数据:db.集合名称.insertMany([JSON 1,JSON 2,JSON 3,...JSON n])

  • 指定_id参数:db.集合名称.insert(_id:"001", name:"gj", gender:1)

注意

  • 插入数据时不需要专门去创建集合(表),因为插入数据时会自动创建集合
  • 插⼊⽂档时, 如果不指定_id参数, MongoDB会为⽂档分配⼀个唯⼀的ObjectId
  • 如果⽂档的_id已经存在则报错

案例

// 插入1条数据
db.test001.insert(name: "张三", age: 18, sex: "男", hobby: "美女");

db.test001.insertOne(name: "张三", age: 18, sex: "男", hobby: "美女");
 
 
// 插入多条数据
db.test001.insertMany([
    name: "张三", age: 18, sex: "男", hobby: "美女",
    name: "李四", age: 20, sex: "男", hobby: "跑车",
    name: "王五", age: 21, sex: "男", hobby: "黑丝",
]);

6、简单查询

查看当前集合所有数据(json文件)

格式db.集合名称.find()

案例

> db.test001.find()
 "_id" : ObjectId("62177e62cec136e6f853bbe9"), "name" : "张三", "age" : 18, "sex" : "男", "hobby" : "美女" 
 "_id" : ObjectId("62177e62cec136e6f853bbea"), "name" : "李四", "age" : 20, "sex" : "男", "hobby" : "跑车" 
 "_id" : ObjectId("62177e62cec136e6f853bbeb"), "name" : "王五", "age" : 21, "sex" : "男", "hobby" : "黑丝" 

7、保存数据

格式db.集合名称.save(document)

注意:如果⽂档的_id已经存在则修改, 如果⽂档的_id不存在则添加

案例

8、修改数据

语法格式

  • db.集合名称.update(<query> ,<update>,multi: <boolean>)

  • 更新一条(字段全部替换):db.集合名称.update(name:'原始数据',name:'修改后数据')

  • 更新一条(仅更新一个字段):db.集合名称.update(name:'原始数据',$set:name:'修改后数据') ,推荐使用

  • 更新全部:db.集合名称.update(name:'原始数据',$set:name:'修改后数据',multi:true)

  • 参数query:查询条件

  • 参数update:更新操作符

  • 参数multi:可选, 默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新

注意multi:true需要和$set配合使用

案例1

//把名字为小黑的更新为小白
> db.test001.update(name: '小黑',name:'小白')))
WriteResult( "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 )
> db.test001.find()                         
 "_id" : ObjectId("621780b5cec136e6f853bbef"), "name" : "张三", "age" : 18, "sex" : "男", "hobby" : "美女" 
 "_id" : ObjectId("621780b5cec136e6f853bbf0"), "name" : "李四", "age" : 20, "sex" : "男", "hobby" : "跑车" 
 "_id" : ObjectId("621780b5cec136e6f853bbf1"), "name" : "王五", "age" : 21, "sex" : "男", "hobby" : "黑丝" 
 "_id" : 1, "name" : "小白"  
  • 注意:这种写法会替换掉其他的字段(全部替换),age、sex、hobby都没有了

案例2

//把名字为王五的更新为小王
> db.test001.update(name:'王五',$set:name:'小王')
WriteResult( "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 )
> db.test001.find()                                ')
 "_id" : ObjectId("621780b5cec136e6f853bbef"), "name" : "张三", "age" : 18, "sex" : "男", "hobby" : "美女" 
 "_id" : ObjectId("621780b5cec136e6f853bbf0"), "name" : "李四", "age" : 20, "sex" : "男", "hobby" : "跑车" 
 "_id" : ObjectId("621780b5cec136e6f853bbf1"), "name" : "小王", "age" : 21, "sex" : "男", "hobby" : "黑丝" 
 "_id" : 1, "name" : "小白" 
  • 可以看出加上$set:后仅更新了name一个字段

案例3

//修改所有人的性别
> db.test001.update(sex: '男',$set:sex: '女',multi:true)
WriteResult( "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 )
> db.test001.find()                               )      ))  )
 "_id" : ObjectId("621780b5cec136e6f853bbef"), "name" : "张三", "age" : 18, "sex" : "女", "hobby" : "美女" 
 "_id" : ObjectId("621780b5cec136e6f853bbf0"), "name" : "李四", "age" : 20, "sex" : "女", "hobby" : "跑车" 
 "_id" : ObjectId("621780b5cec136e6f853bbf1"), "name" : "小王", "age" : 21, "sex" : "女", "hobby" : "黑丝" 
 "_id" : 1, "name" : "小白" 
  • multi:true:起到全部JSON替换的功能

9、删除数据

格式db.集合名称.remove(<query>,justOne: <boolean>)

  • 参数query:可选,删除的⽂档的条件
  • 参数justOne:可选, 如果设为true或1, 则只删除⼀条, 默认false, 表示删除多条

案例

//先删除一条数据
> db.test001.remove(sex: '女', justOne:true)
WriteResult( "nRemoved" : 1 )
> db.test001.find()
 "_id" : ObjectId("621780b5cec136e6f853bbf0"), "name" : "李四", "age" : 20, "sex" : "女", "hobby" : "跑车" 
 "_id" : ObjectId("621780b5cec136e6f853bbf1"), "name" : "小王", "age" : 21, "sex" : "女", "hobby" : "黑丝" 
 "_id" : 1, "name" : "小白" 
// 全部删除
> db.test001.remove(sex: '女')
WriteResult( "nRemoved" : 2 )
> db.test001.find()            )
 "_id" : 1, "name" : "小白" 

四、高级查询

数据准备(三国争霸):

db.test002.insertMany([
    name: "张飞", hometown: "蜀国", age: 30, sex: "男",
    name: "关羽", hometown: "蜀国", age: 40, sex: "男",
    name: "刘备", hometown: "蜀国", age: 50, sex: "男",
    name: "曹操", hometown: "魏国", age: 45, sex: "男",
    name: "司马懿", hometown: "魏国", age: 45, sex: "男",
    name: "孙权", hometown: "吴国", age: 50, sex: "男"
]);

1、数据查询

  • 条件查询:db.集合名称.find(条件⽂档)

  • 查询只返回第⼀个:db.集合名称.findOne(条件⽂档)

  • 将结果格式化:db.集合名称.find(条件⽂档).pretty()

案例1

// 查询年龄为50
> db.test002.find(age:50)
 "_id" : ObjectId("6219a246d1ca96a61ceca3e7"), "name" : "刘备", "hometown" : "蜀国", "age" : 50, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3ea"), "name" : "孙权", "hometown" : "吴国", "age" : 50, "sex" : "男" 

// 查询年龄为45
> db.test002.find(age:45)
 "_id" : ObjectId("6219a246d1ca96a61ceca3e8"), "name" : "曹操", "hometown" : "魏国", "age" : 45, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3e9"), "name" : "司马懿", "hometown" : "魏国", "age" : 45, "sex" : "男" 

案例2

//查询一个年龄为50
> db.test002.findOne(age:50)

        "_id" : ObjectId("6219a246d1ca96a61ceca3e7"),
        "name" : "刘备",
        "hometown" : "蜀国",
        "age" : 50,
        "sex" : "男"


//查询一个年龄为45
> db.test002.findOne(age:45)

        "_id" : ObjectId("6219a246d1ca96a61ceca3e8"),
        "name" : "曹操",
        "hometown" : "魏国",
        "age" : 45,
        "sex" : "男"

案例3

//美化输出年龄为50
> db.test002.find(age:50).pretty()

        "_id" : ObjectId("6219a246d1ca96a61ceca3e7"),
        "name" : "刘备",
        "hometown" : "蜀国",
        "age" : 50,
        "sex" : "男"


        "_id" : ObjectId("6219a246d1ca96a61ceca3ea"),
        "name" : "孙权",
        "hometown" : "吴国",
        "age" : 50,
        "sex" : "男"

2、比较运算符

等于: 默认是等于判断, 没有运算符

⼩于:$lt (less than)

⼩于等于:$lte (less than equal)

⼤于:$gt (greater than)

⼤于等于:$gte

不等于:$ne

格式db.集合名称.find(age:$gte:18)

案例

//年龄小于45
> db.test002.find(age:$lt:45)
 "_id" : ObjectId("6219a246d1ca96a61ceca3e5"), "name" : "张飞", "hometown" : "蜀国", "age" : 30, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3e6"), "name" : "关羽", "hometown" : "蜀国", "age" : 40, "sex" : "男" 

//年龄小于等于45
> db.test002.find(age:$lte:45)
 "_id" : ObjectId("6219a246d1ca96a61ceca3e5"), "name" : "张飞", "hometown" : "蜀国", "age" : 30, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3e6"), "name" : "关羽", "hometown" : "蜀国", "age" : 40, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3e8"), "name" : "曹操", "hometown" : "魏国", "age" : 45, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3e9"), "name" : "司马懿", "hometown" : "魏国", "age" : 45, "sex" : "男" 

//年龄大于45
> db.test002.find(age:$gt:45)
 "_id" : ObjectId("6219a246d1ca96a61ceca3e7"), "name" : "刘备", "hometown" : "蜀国", "age" : 50, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3ea"), "name" : "孙权", "hometown" : "吴国", "age" : 50, "sex" : "男" 

//年龄大于等于45
> db.test002.find(age:$gte:45)
 "_id" : ObjectId("6219a246d1ca96a61ceca3e7"), "name" : "刘备", "hometown" : "蜀国", "age" : 50, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3e8"), "name" : "曹操", "hometown" : "魏国", "age" : 45, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3e9"), "name" : "司马懿", "hometown" : "魏国", "age" : 45, "sex" : "男" 
 "_id" : ObjectId("6219a246d1ca96a61ceca3ea"), "name" : "孙权", "hometown" : "吴国", "age" : 50, "sex" : "男" 

//年龄不等于45
> db.test002.find(age:$ne:45)
 "_id" : ObjectId("6219a246d1ca96a61ceca3e5"), "name" : "张飞", "hometown" : "蜀国", "age" : 30, "sex" : "男" 
 "_id" : ObjectId("6219a246

elasticsearch入门,看这一篇就够了(代码片段)

Elasticsearch入门,看这一篇就够了前言可视化工具kibanakibana的安装kibana配置kibana的启动Elasticsearch入门操作操作index创建index索引别名有什么用删除索引查询索引exist索引操作document插入document查询document删除document更新document使用... 查看详情

redux从入门到进阶,看这一篇就够了!(代码片段)

Redux,带你从入门到进阶🌂序言☂️一、基础知识1、Redux概念简述2、Redux的工作流程🎃二、使用Antd实现TodoList页面布局1、在项目中使用Antd2、使用Antd实现TodoList的基本布局3、创建redux中的store(1)创建storeÿ... 查看详情

redux从入门到进阶,看这一篇就够了!(代码片段)

Redux,带你从入门到进阶🌂序言☂️一、基础知识1、Redux概念简述2、Redux的工作流程🎃二、使用Antd实现TodoList页面布局1、在项目中使用Antd2、使用Antd实现TodoList的基本布局3、创建redux中的store(1)创建storeÿ... 查看详情

json入门看这一篇就够了

什么是JSONJSON:JavaScriptObjectNotation【JavaScript对象表示法】JSON是存储和交换文本信息的语法。类似XML。JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言S为什么需要JSON提到JSON,我们就应该和XML来进行对... 查看详情

菜鸟用python操作mongodb,看这一篇就够了

MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就... 查看详情

华为出品python入门教程:从零基础入门到精通,这一篇就够了(代码片段)

前言本文罗列了了python零基础入门到精通的详细教程,内容均以知识目录的形式展开。01.python由来与发展介绍02.项目开发流程第一章markdown编辑器01.markdown基本语法02.Typora简介与安装03.Windows上gitee+Typora设置图床04.macOS上gitee... 查看详情

288页的python编程文档,从入门到实践,入门看这一篇就够了

...thon的一些设计哲学。Python自带了很完善的库,涵盖了数据库,网络,文件处理,GUI等方方面面,通过这些库,我们可以比较快速地解决一些棘手问题,也可以将其作为基础库 查看详情

c语言入门到精通,这一篇就够了(13万字笔记)(代码片段)

...:先关注收藏,再查看,13万字保姆级C语言从入门到精通教程。文章目录计算机常识什么是计算机程序?什么是计算机语言?常见的计算机语言类型有哪些?什么是C语言?C语言历史C语言标准C语言现状为什么要学习C语言?... 查看详情

史上最简明的tcpdump入门指南,看这一篇就够了(代码片段)

简介网络数据包截获分析工具。支持针对网络层、协议、主机、网络或端口的过滤。并提供and、or、not等逻辑语句帮助去除无用的信息。例子1、监听特定网卡tcpdump-ien02、监听特定主机例子:监听本机跟主机182.254.38.55之间往... 查看详情

vue3核心技能从入门到难点攻破,看这一篇就够了!

在Vue2.0时代,国内大厂的前端开发框架,几乎清一色偏向React。因为对于业务成熟的公司而言,一个项目,可能会包含很多非侵入式的代码和服务,并不是功能实现了就万事大吉。但随着Vue3.0横空出世,字... 查看详情

黑客攻防实战,黑客入门到精通,收藏这一篇就够了

前言你知道在每天上网时,有多少黑客正在浏览我们计算机中的重要数据吗﹖黑客工具的肆意传播,使得即使是稍有点计算机基础的人,就可以使用简单的工具对网络中一些疏于防范的主机进行攻击,在入侵成功... 查看详情

spring入门看这一篇就够了!!!不够你找我!

今天呢,咱就来点好家伙,前面都是些java基础,怎么说也得来点框架对吧,话不多说,煌sir带你开干!干就完了!  Spring框架一.Spring简述为什么要学spring?传统项目优点:搭建容易传统项目缺点:service、dao 对象都是程序员手动n... 查看详情

git入门看这一篇就够了!(转)(代码片段)

...一: 已提交(committed):数据已经安全的保存在本地数据库中。已修改(modified):已修改表示修改了文件,但还没保存到数据库中。已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快... 查看详情

黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.... 查看详情

redux从入门到进阶,看这一篇就够了!(代码片段)

Redux,带你从入门到进阶🌂序言☂️一、基础知识1、Redux概念简述2、Redux的工作流程🎃二、使用Antd实现TodoList页面布局1、在项目中使用Antd2、使用Antd实现TodoList的基本布局3、创建redux中的store(1)创建storeÿ... 查看详情

网络安全零基础入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。(代码片段)

学前感言1.这是一条需要长时间坚持的道路,如果你只有三分钟的热情那么我劝你可以放弃往下看了。2.多练多想,不要离开了教程就什么都不会,最好能在看完教程后自己独立地完成技术方面的开发。3.学习过程中遇... 查看详情

handler看这一篇就够了(代码片段)

Handler使用首先来熟悉一下Handler的四种使用方式,如果比较熟悉可以直接跳过:通过sendMessage消息机制来发送sendEmptyMessage(int);//发送一个空的消息sendMessage(Message);//发送消息,消息中可以携带参数sendMessageAtTime(Message,long... 查看详情

python函数式编程,看这一篇就够了!

...hon编程时光本文对Python中的函数式编程技术进行了简单的入门介绍。头等函数在Python中,函数是「头等公民」(first-class)。也就是说,函数与其他数据类型(如int)处于平等地位。因而,我们可以 查看详情