MongoDB的安装 && 基本概念学习 && 数据库、集合和文档的基础操作

本文介绍了MongoDB的安装过程,包括在Windows上的安装步骤。接着,文章阐述了MongoDB的基本概念,如NoSQL、数据库、集合和文档。还详细讲解了如何创建、删除数据库,插入、更新和删除文档,以及查询操作,包括AND和OR条件查询。
摘要由CSDN通过智能技术生成

一、什么是MongoDB?

1、了解MongoDB之前,我们先来了解一下NoSQL:
NoSQL指的是非关系型的数据库,有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
2、我们为什么使用NoSQL
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL 数据库的发展却能很好的处理这些大的数据。
3、MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统,是NoSQL类型的数据库。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
在高负载的情况下,添加更多的节点,可以保证服务器性能。

二、MangoDB的安装与使用

1、MongoDB安装
下载地址:https://www.mongodb.com/download-center/community
在这里插入图片描述
根据你的系统下载 32 位或 64 位的 .msi 文件,下载后双击开始安装。
安装过程中,你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。
在这里插入图片描述
可修改默认安装路径
在这里插入图片描述
安装和配置MongoDB作为Windows服务。
注:从MongoDB 4.0开始,您可以在安装期间配置和启动MongoDB作为Windows服务,并在成功安装后启动MongoDB服务。
在这里插入图片描述
下一步安装 “install mongoDB compass” 不勾选,否则可能要很长时间都一直在执行安装,MongoDB Compass 是一个图形界面管理工具,我们可以在后面自己到官网下载安装,下载地址:https://www.mongodb.com/download-center/compass
在这里插入图片描述
2、MongoDB使用
至此,我们已经安装好了MongoDB。MongoDB Server 启动时会调用 mongod.cfg 配置文件(也在bin目录下),如果要调整配置,直接按照官方文档里的说明修改即可。
官方文档地址:https://docs.mongodb.com/manual/reference/configuration-options/

C:\Program Files\MongoDB\Server\4.0\bin>net stop MongoDB
MongoDB Server 服务正在停止.
MongoDB Server 服务已成功停止。


C:\Program Files\MongoDB\Server\4.0\bin>net start MongoDB
MongoDB Server 服务正在启动 .
MongoDB Server 服务已经启动成功。

MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。当你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件。


C:\Program Files\MongoDB\Server\4.0\bin>mongo.exe
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("12977ee6-ab51-4759-baee-ef7e9d366351") }
MongoDB server version: 4.0.10
...		...

> db			//db 命令用于查看当前操作的文档(数据库)
test
> 2 + 2			//可以做简单计算
4
> db.runoob.insert({x:10})			//插入一些简单的记录并查找它,如将 10 插入到 runoob 集合的 x 字段
WriteResult({ "nInserted" : 1 })
> db.runoob.find()
{ "_id" : ObjectId("5d37e7eacf5c2005ae4a553a"), "x" : 10 }

三、MongoDB中的基本概念

1、MongoDB中的术语
下面这个表可以帮助我们更好理解:
在这里插入图片描述
(1)数据库

> show dbs		//显示所有数据的列表
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> db		//显示当前数据库对象或集合
test
> use local		//连接到一个指定的数据库
switched to db local
> db
local

数据库通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串:

  • 不能是空字符串("")。
  • 不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
  • 应全部小写。
  • 最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

  • admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config: 当Mongo用于分片设置时,config数据库在内部使用,保存分片的相关信息。

(2)文档
文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
(3)集合
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
2、MongoDB中的数据类型
在这里插入图片描述
下面说明下几种重要的数据类型:
(1)ObjectId
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

  • 创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
  • 机器标识码
  • PID
  • 随机数
    在这里插入图片描述

MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象,可以通过 getTimestamp 函数来获取文档的创建时间。

> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2019-07-24T06:01:01Z")
> newObject.str			//ObjectId 转为字符串
5d37f41db5b97e01005e30e7

(2)字符串
BSON 字符串都是 UTF-8 编码
(3)日期

> var mydate = new Date()		//格林尼治时间
> mydate
ISODate("2019-07-24T06:08:54.286Z")
> typeof mydate
object

四、MongoDB的简单使用

1、创建数据库
在这里插入图片描述
如果数据库不存在,则创建数据库,否则切换到指定数据库。

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> use runoob
switched to db runoob
> db
runoob
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

我们可以看到,刚创建的数据库 runoob 并不在数据库的列表中。 要显示它,我们需要向 runoob 数据库插入一些数据。

> db.runoob.insert({"name":"haha"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
runoob  0.000GB
test    0.000GB

2、删除数据库
在这里插入图片描述

> db
runoob
> db.dropDatabase()
{ "dropped" : "runoob", "ok" : 1 }
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

3、创建集合并查询
在这里插入图片描述

  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项
    在这里插入图片描述
> db.createCollection("runoob")
{ "ok" : 1 }
> show collections		//查看已有集合
runoob
> show tables			//查看已有集合
runoob

下面是带有几个关键参数的 createCollection() 的用法:
创建固定集合 test,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。


> db.createCollection("test",{capped : true,autoIndexId : true,size : 6142800,max : 1000})
{
        "note" : "the autoIndexId option is deprecated and will be removed in a future release",
        "ok" : 1
}
> show collections
runoob
test

此外,在 MongoDB 中,当你向一个不存在的集合插入一些文档时,MongoDB 会自动创建集合。

> db.test2.insert({"name" : "haha"})
WriteResult({ "nInserted" : 1 })
> show collections
runoob
test
test2

4、删除集合
在这里插入图片描述
如果成功删除选定集合,则 drop() 方法返回 true。

> show collections
runoob
test
test2
> db.test2.drop()
true
> show collections
runoob
test

5、插入文档

语法格式
在这里插入图片描述
下面实例中test是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

> db.test.insert({title : 'MangoDB学习',own : 'yexi'})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB学习", "own" : "yexi" }

我们也可以将数据定义为一个变量,然后执行插入操作:

> document=({name : "haha",age : "20"});
{ "name" : "haha", "age" : "20" }
> db.test.insert(document)
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB学习", "own" : "yexi" }
{ "_id" : ObjectId("5d38007a85ad3637d228a6a4"), "name" : "haha", "age" : "20" }

此外,插入文档也可以使用 db.test.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据,所以这个我们放在后面的更新文档来看。

> db.test.save(document)
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB学习", "own" : "yexi" }
{ "_id" : ObjectId("5d38007a85ad3637d228a6a4"), "name" : "haha", "age" : "20" }
{ "_id" : ObjectId("5d38011185ad3637d228a6a5"), "name" : "haha", "age" : "20" }

6、更新文档
(1)update()方法
在这里插入图片描述

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
> db.test.find()                                          
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB学习", "own" : "yexi" }
> db.test.update({"title" : "MangoDB学习"},{$set:{"title" : "MangoDB"}}))
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test.find()
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB", "own" : "yexi" }

我们可以使用multi参数,修改多个文档

> db.test.find()                                                      })
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB", "own" : "yexi" }
{ "_id" : ObjectId("5d38007a85ad3637d228a6a4"), "name" : "haha", "age" : "20" }
{ "_id" : ObjectId("5d38011185ad3637d228a6a5"), "name" : "haha", "age" : "20" }
> db.test.update({"name" : "haha"},{$set:{"name" : "hehe"}},{multi : true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
> db.test.find()
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB", "own" : "yexi" }
{ "_id" : ObjectId("5d38007a85ad3637d228a6a4"), "name" : "hehe", "age" : "20" }
{ "_id" : ObjectId("5d38011185ad3637d228a6a5"), "name" : "hehe", "age" : "20" }

(2)save()方法
在这里插入图片描述

  • document : 文档数据。
  • writeConcern :可选,抛出异常的级别。
> db.test.find()
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB", "own" : "yexi" }
{ "_id" : ObjectId("5d38007a85ad3637d228a6a4"), "name" : "hehe", "age" : "20" }
{ "_id" : ObjectId("5d38011185ad3637d228a6a5"), "name" : "hehe", "age" : "20" }
> db.test.save({"_id" : ObjectId("5d38007a85ad3637d228a6a4"),"name" : "heihei","age" : "17"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test.find()
{ "_id" : ObjectId("5d37ffd785ad3637d228a6a3"), "title" : "MangoDB", "own" : "yexi" }
{ "_id" : ObjectId("5d38007a85ad3637d228a6a4"), "name" : "heihei", "age" : "17" }
{ "_id" : ObjectId("5d38011185ad3637d228a6a5"), "name" : "hehe", "age" : "20" }

7、删除文档
在这里插入图片描述

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别。
> db.test.find()
{ "_id" : ObjectId("5d38007a85ad3637d228a6a4"), "name" : "hehe", "age" : "20" }
{ "_id" : ObjectId("5d38011185ad3637d228a6a5"), "name" : "hehe", "age" : "20" }
> db.test.remove({"name" : "hehe"})		//删除了所有符合条件的数据
WriteResult({ "nRemoved" : 2 })
> db.test.find()			//没有数据

我们可以使用justOne参数,只删除一个文档

> db.test.find()
{ "_id" : ObjectId("5d38011185ad3637d228a6a5"), "name" : "haha", "age" : "20" }
{ "_id" : ObjectId("5d3809bc85ad3637d228a6a6"), "name" : "haha", "age" : "20" }
> db.test.remove({"name" : "haha"},{justOne : true})		//删除一条数据
WriteResult({ "nRemoved" : 1 })
> db.test.find()
{ "_id" : ObjectId("5d3809bc85ad3637d228a6a6"), "name" : "haha", "age" : "20" }

如果要删除所有文档,我们remove时不指定条件即可

> db.test.remove({})
WriteResult({ "nRemoved" : 1 })
> db.test.find()

8、查询文档
在这里插入图片描述

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,pretty() 方法以格式化的方式来显示所有文档。
在这里插入图片描述

> db.test.find()
{ "_id" : ObjectId("5d380ccf85ad3637d228a6a7"), "name" : "haha", "age" : "20" }
{ "_id" : ObjectId("5d380cd185ad3637d228a6a8"), "name" : "hehe", "age" : "20" }
> db.test.find().pretty()
{
        "_id" : ObjectId("5d380ccf85ad3637d228a6a7"),
        "name" : "haha",
        "age" : "20"
}
{
        "_id" : ObjectId("5d380cd185ad3637d228a6a8"),
        "name" : "hehe",
        "age" : "20"
}

对比常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
在这里插入图片描述
(1)MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,相当于常规 SQL 的 AND 条件。以下示例相当于WHERE name=hehe AND age=18:


> db.test.find()
{ "_id" : ObjectId("5d380ccf85ad3637d228a6a7"), "name" : "haha", "age" : "18" }
{ "_id" : ObjectId("5d380cd185ad3637d228a6a8"), "name" : "hehe", "age" : "18" }
{ "_id" : ObjectId("5d3811a185ad3637d228a6a9"), "name" : "hehe", "age" : "20" }
> db.test.find({"name" : "hehe","age" : "18"})
{ "_id" : ObjectId("5d380cd185ad3637d228a6a8"), "name" : "hehe", "age" : "18" }

(2)MongoDB OR 条件
在这里插入图片描述
and和or的联合使用,以下示例相当于WHERE age > 19 AND (name = hehe OR sex = f)

> db.test.find()
{ "_id" : ObjectId("5d3813af85ad3637d228a6aa"), "name" : "hehe", "age" : 20, "sex" : "m" }
{ "_id" : ObjectId("5d38140385ad3637d228a6ab"), "name" : "haha", "age" : 20, "sex" : "f" }
{ "_id" : ObjectId("5d38140f85ad3637d228a6ac"), "name" : "lala", "age" : 19, "sex" : "f" }

> db.test.find({"age" : {$gt:19},$or:[{"name" : "hehe"},{"sex" : "f"}]})
{ "_id" : ObjectId("5d3813af85ad3637d228a6aa"), "name" : "hehe", "age" : 20, "sex" : "m" }
{ "_id" : ObjectId("5d38140385ad3637d228a6ab"), "name" : "haha", "age" : 20, "sex" : "f" }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值