热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【快速上手MongoDB】介绍、安装、核心概念、基本操作

MongoDB快速上手简介使用Docker安装核心概念数据库Database集合Collection文档Document基本操作库集合文档插入删除更新英文官方文档:https:do




MongoDB 快速上手


  • 简介
  • 使用 Docker 安装
  • 核心概念
    • 数据库 Database
    • 集合 Collection
    • 文档 Document

  • 基本操作
    • 集合
    • 文档
      • 插入
      • 删除
      • 更新



英文官方文档:https://docs.mongodb.com/manual/
MongoDB 中文网:MonogDB 中文网 | MongoDB 中文文档



简介

MongoDB 是一个文档数据库,旨在方便应用开发和扩展。


MongoDB is a document database designed for ease of application development and scaling.


MongoDB 非关系型数据库,但是它功能丰富,很像关系型数据库。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

MongoDB 支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

特点:


  • 面向集合存储,易存储对象类型的数据
  • 支持查询,以及动态查询
  • 支持 RUBY、PYTHON、JAVA、C++、PHP、C# 等多种语言
  • 文件存储格式为 BSON(一种 JSON 的扩展)
  • 支持复制和故障恢复和分片
  • 支持事务支持
  • 索引、聚合、关联 …

应用场景:


  • 游戏应用:使用云数据库 MongoDB 作为游戏服务器的数据库存储用户信息。用户的游戏装备、积分等直接以内嵌文档的形式存储,方便进行查询与更新。
  • 物流应用:使用云数据库 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以云数据库 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来,方便快捷且一目了然。
  • 社交应用:使用云数据库 MongoDB 存储用户信息以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。并且,云数据库 MongoDB 非常适合用来存储聊天记录,因为它提供了非常丰富的查询,并在写入和读取方面都相对较快。
  • 视频直播:使用云数据库 MongoDB 存储用户信息、礼物信息等。
  • 大数据应用:使用云数据库 MongoDB 作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。

使用 Docker 安装

传统安装方式:下载安装包、解压、配置环境变量 … 这里不采用这种方式。


使用 Docker 安装:

# 1.拉取 mongodb 镜像
docker pull mongo:5.0.5
# 2.运行 mongo 镜像
docker run -d --name mongo -p 27017:27017 mongo:5.0.5
# 3.进入 mongo 容器, bc6c为容器id
docker ps # 查看容器id
docker exec -it bc6c bash # 进入容器终端

Docker 指令参考:Docker 容器使用 | 菜鸟教程 (runoob.com)



核心概念

参考:MongoDB 概念解析 | 菜鸟教程 (runoob.com)



SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表 / 集合
rowdocument数据记录行 / 文档
columnfield数据字段 /域
indexindex索引
table joins表连接,MongoDB 不支持
primary keyprimary key主键,MongoDB 自动将 _id 字段设置为主键


数据库 Database


RDB (Relational Database):关系型数据库


MongoDB 中的库就类似于 RDB 中库的概念,用来通过不同库隔离不同应用数据。

MongoDB 中可以建立多个数据库,每个库都有自己的集合和权限,不同的数据库放置在不同的文件中。

默认的数据库为 “test”,数据库存储在启动指定的 data 目录中。


集合 Collection

集合就是 MongoDB 的文档组,类似于 RDB 中的表的概念。

集合存在于数据库中,一个库中可以创建多个集合。每个集合没有固定的结构,这意味着对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。


文档 Document

文档是一组键值对(即 BSON)。

MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型。


上面这点与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。


一个简单的文档例子:(与 JSON 看起来是一模一样)

{"user": "001", "name":"张三", "age": "15"}

基本操作


MongoDB 创建数据库 | 菜鸟教程 (runoob.com)

MongoDB 删除数据库 | 菜鸟教程 (runoob.com)


MongoDB 中默认有 3 个保留库:


  • admin

    从权限的角度来看,这是 “root” 数据库。

    要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。

    一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

  • local

    这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。

    即这个库中存储的数据仅当前服务器可见,其他服务器无法获取。

  • config

    当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片的相关信息。

# 显示所有库的列表
show dbs # show databses 简写
# 显示当前的数据库对象
db
# 连接到指定数据库(无则创建)
use mydb
# 插入数据到mydb库中
db.mydb.insert({"name", "lzy"})
# 删除当前所处在的库中
db.dropDatabase()

使用 use 创建库后,直接 show dbs 看不见,因为 MongoDB 不显示没有数据的库。



集合


MongoDB 创建集合 | 菜鸟教程 (runoob.com)

MongoDB 删除集合 | 菜鸟教程 (runoob.com)


# 查看库中的所有集合
show collections
show tables

# 创建集合
db.createCollection('users')

db.createCollection(name, [options]),options 可以是如下参数:


字段类型描述
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
size数值(可选)为固定集合指定一个最大值,即字节数。
如果 capped 为 true,则必须指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。

# 如果不先创建集合, 直接插入一些文档,MongoDB 会自动创建集合。
db.teachers.insert({"name" : "zhangsan"})

# 删除指定集合
db.teachers.drop() # 删除teachers集合
db.users.drop() # 删除users集合

文档

查询某个集合的所有文档

# 查询某个集合的所有文档
db.users.find() # 查询users集合的数据

插入


MongoDB 插入文档 | 菜鸟教程 (runoob.com)



MongoDB 中每个文档都会有一个 _id 作为唯一标识。

_id 默认会自动生成,如果手动指定将使用手动指定的值作为 _id 的值。



  • 插入单条文档

# 往users集合插入单条数据
db.users.insert({"name": "zhangsan", "age": 23})

  • 插入多条文档

# 往users集合插入多条数据
# 插入多条可以使用 insert 也可以使用 insertMany
db.users.insert([
{"name":"lisi", "age":16},
{"name":"wangwu", "age":18}
])

  • JS 脚本方式插入

for (let i = 0; i <3; i++) {
db.users.insert({_id: i, name: 'user' + i, age: i+10});
}
# 注意脚本执行完只会显示最后一条插入的记录, 所以是1
# WriteResult({ "nInserted" : 1 })

删除


MongoDB 删除文档 | 菜鸟教程 (runoob.com)


# 语法
db.集合名称.remove(
, # 可选,删除条件
{
justOne: , # 可选,默认为false删除所有匹配的文档, 为true或1则只删除一个
writeConcern: # 可选,抛出异常的级别
}
)

# 删除集合中所有文档, 空条件必须传 {}, 不能不传
> db.users.remove({})
# 删除_id为1的文档
> db.users.remove({_id: 1})
# 删除_id是自动生成的数据
> db.users.remove({_id: ObjecteId("61fd0addc2df889b4ad70789")}})

更新


MongoDB 更新文档 | 菜鸟教程 (runoob.com)


# 语法
db.collection.update(
, # 查询条件
, # 更新内容,可以写对象或操作符
{
upsert: , # 可选,默认false不存在也不插入,为true则不存在就插入
multi: , # 可选,默认false只更新查询到的第一条,为true则更新查询到的所有
writeConcern: # 可选,抛出异常的级别
}
)

# 默认会将 符合条件的文档 全部更新成后面的文档, 相当于先删除再插入(_id会保留)
> db.users.update({age: 12},{age: 28})
# before: { "_id" : 2, "name" : "user2", "age" : 12 }
# after: { "_id" : 2, "age" : 28 } # name丢失了
# 利用 $set 保留原来的数据进行更新
> db.users.update({name: "user1"}, {$set: {name: "用户1"}})
# before: { "_id" : 1, "name" : "user1", "age" : 23 }
# after: { "_id" : 1, "name" : "用户1", "age" : 23 } # 其他字段都保留了
# 保留原来数据更新, 只更新符合条件的第一条数据
> db.users.update({age: 23}, {$set: {age: 25}}, {multi: false})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
# 保留原来数据更新, 更新满足条件的所有数据 (必须用 $set)
> db.users.update({age: 23}, {$set: {age: 25}}, {multi: true})
WriteResult({ "nMatched" : 9, "nUpserted" : 0, "nModified" : 9 })
# 保留原来数据更新,更新满足条件的所有数据,没有数据时插入
> db.users.update({name: '小白'}, {$set: {name: '小黑'}}, {upsert: true})
$WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("61fd18ba88455f04936fe1e1")
})


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
author-avatar
品位人生2602905223
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有