一、引言
????????????? 从今天开始,我要正式开始介绍MongoDB的使用方法了。在此之前,我用了两篇文章分别介绍了如何在Linux系统和Windows系统上安装和配置MongoDB系统。如果你已经知道了具体的安装方法,感觉还是很简单的,但是如果你从来没有操作过的,心里还是有些心虚的,所以这个系列就从最基本的安装开始。既然是一个系列的文章,肯定会有安装和配置的文章,也会有数据类型,基本操作的文章,高级操作也是少不了的,这样才可以称得上是系列。前面两篇文章就算是引子吧,从今天开始就是介绍如何使用MongoDB了。
二、MongoDB 概念解析
??????????? 下表将帮助您更容易理解Mongo中的一些概念:
?????????????? SQL术语/概念 ?? ?MongoDB术语/概念 ?? ?解释/说明
?????????????? database ?? ????????? database ?? ???????? ? ? ? ?? 数据库
?????????????? table ?? ??????? ? ? ???? collection ?? ????????????????? 数据库表/集合
?????????????? row ?? ?????????????????? document ?? ???????????????? 数据记录行/文档
?????????????? column ?? ???????????? field ?? ????????????????????????? 数据字段/域
?????????????? index ?? ??????????????? index ?? ??????????????????????? 索引
?????????????? table joins ?? ? ??? ????????????????????????????????????? 表连接,MongoDB不支持
?????????????? primary key ?? ????? primary key ?? ????????????? 主键,MongoDB自动将_id字段设置为主键
??????????? 通过下图实例,我们也可以更直观的了解Mongo中的一些概念:
??????????? 1、数据库
????????????????????? 一个mongodb中可以建立多个数据库。MongoDB的默认数据库为"db",该数据库存储在data目录中。MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
????????????????????? 数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。
?????????????????????????? 不能是空字符串("")。
?????????????????????????? 不得含有' '(空格)、.、$、/、和 (空字符)。
?????????????????????????? 应全部小写。
?????????????????????????? 最多64字节。
????????????????????? 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
??????????????????????????? admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
??????????????????????????? local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
??????????????????????????? config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
???????????? 2、文档
???????????????????? 文档是MongoDB中最核心的概念,我们可以把文档理解为关系数据库中的一条记录。文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
??????????????????? 一个简单的文档例子如下:
?????????????????????? {"name":"zhangsan","age":23}
???????????????????? 需要注意的是:
?????????????????????????? 2.1、文档中的键/值对是有序的。
?????????????????????????? 2.2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
?????????????????????????? 2.3、MongoDB区分类型和大小写。
?????????????????????????? 2.4、MongoDB的文档不能有重复的键。
?????????????????????????? 2.5、文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
???????????????????? 文档键命名规范:
?????????????????????????? 3.1、键不能含有 (空字符)。这个字符用来表示键的结尾。
?????????????????????????? 3.2、.和$有特别的意义,只有在特定环境下才能使用。
?????????????????????????? 3.3、以下划线"_"开头的键是保留的(不是严格要求的)。
???????????? 3、集合
?????????????????????? 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
?????????????????????? 集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
?????????????????????? 比如,我们可以将以下不同数据结构的文档插入到集合中:
{"site":www.baidu.com"}
{www.google.com",nameGooglewww.cnblogs.com博客园num5}
?????????????????????? 当第一个文档插入时,集合就会被创建。
?????????????????????? 合法的集合名:
???????????????????????????? 集合名不能是空字符串""。
???????????????????????????? 集合名不能含有 字符(空字符),这个字符表示集合名的结尾。
???????????????????????????? 集合名不能以"system."开头,这是为系统集合保留的前缀。
???????????????????????????? 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
??????????? 4、元数据
??????????????????? 数据库的信息是存储在集合中。它们使用了系统的命名空间:dbname.system.*
??????????????????? 在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:
??????????????????? 集合命名空间 ?? ?????????????????????????????????? 描述
???????????????????? dbname.system.namespaces ?? ????? 列出所有名字空间。
???????????????????? dbname.system.indexes ?? ???????????? 列出所有索引。
???????????????????? dbname.system.profile ?? ?????????????? 包含数据库概要(profile)信息。
???????????????????? dbname.system.users ?? ?????????????? 列出所有可访问数据库的用户。
???????????????????? dbname.local.sources ?? ?????????????? 包含复制对端(slave)的服务器信息和状态。
??????????????????? 对于修改系统集合中的对象有如下限制。
??????????????????? 在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
??????????????????? {{system.users}}是可修改的。 {{system.profile}}是可删除的。
????????? 5、MongoDB 数据类型
?????????????????? 下表为MongoDB中常用的几种数据类型。
????????????????????? 数据类型 ?? ???????????????????????????????? 描述
????????????????????? String?? ????????????????????????????? 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
????????????????????? Integer?? ???????????????????????????? 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
????????????????????? Boolean?? ?????????????????????????? 布尔值。用于存储布尔值(真/假)。
????????????????????? Double?? ???????????????????????????? 双精度浮点值。用于存储浮点值。
????????????????????? Min/Max keys?? ??? ? ? ? ? ? ? ?? 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
????????????????????? Array?? ??????????????????????????????? 用于将数组或列表或多个值存储为一个键。
????????????????????? Timestamp?? ?????????????????????? 时间戳。记录文档修改或添加的具体时间。
????????????????????? Object?? ????????????????????????????? 用于内嵌文档。
????????????????????? Null?? ????????????????????????????????? 用于创建空值。
????????????????????? Symbol?? ????????? ????????????????? 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
????????????????????? Date?? ??????????????????????????????? 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
????????????????????? Object ID?? ???????????????????????? 对象 ID。用于创建文档的 ID。
????????????????????? Binary Data?? ???????????????????? 二进制数据。用于存储二进制数据。
????????????????????? Code?? ?????????????????????????????? 代码类型。用于在文档中存储 JavaScript 代码。
????????????????????? Regular expression??????????? 正则表达式类型。用于存储正则表达式。
三、基本命令使用详解
??????? ? ??? MongoDB系统里面也有数据库的概念,这个数据库和关系型数据库的概念是一致的。数据库的操作是基本,我们有了数据库,才能在数据里面建立集合,集合和关系型数据库里面的表的概念是一致的,有了集合,我们才可以往集合里面增加数据,增加的数据就是文档,文档和关系型数据库里面的记录的概念是一致的。
???????????? 1、"show dbs" 命令可以显示所有数据的列表。
# ./mongo 192.168.127.1
MongoDB shell version: 3.6.3
connecting to: mongodb://192.168.127.1:27017/test
MongoDB server version: 3
> show dbs
admin 0.000GB
config .000GB
local .000GB
>
???????? 2、执行 "db" 命令可以显示当前数据库对象或集合,也可以使用db.getName()命令。
# ./mongo db
test
> db.getName()
test
>
???????? 3、运行"use"命令,可以连接到一个指定的数据库。
> use school
switched to db school
> db
school
>
???????? 4、创建数据库
?????????????? MongoDB 创建数据库的语法格式如下:
?????????????????? use DATABASE_NAME
?????????????? 如果数据库不存在,则创建数据库,否则切换到指定数据库。
> use school
switched to db school
> db
school
>
?????????????? 如果你想查看所有数据库,可以使用 show dbs 命令:
> show dbs
admin .000GB
config .000GB
local .000GB
>
?????????????? 可以看到,我们刚创建的数据库 school 并不在数据库的列表中,要显示它,我们需要向 school 数据库插入一些数据。
> db.students.insert({huangFeiHong33,sex:1,school:GuangDongDaXueGuangDongFoShan})
WriteResult({ nInserted" : 1 })
>.000GB
school .000GB
>
?????????????? MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
???????? 5、MongoDB 删除数据库
?????????????? MongoDB 删除数据库的语法格式如下:
?????????????????? db.dropDatabase()
??????????????? 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
?????????????? ? 5.1、以下实例我们删除了数据库 school。
??????????????????????? 首先,查看所有数据库:
> show dbs
admin .000GB
config .000GB
local .000GB
school .000GB
>
??????????????????? 接下来我们切换到数据库 school:
> use school
switched to db school
>
??????????????????? 执行删除命令:
> db.dropDatabase()
{ droppedschoolok1 }
??????????????????? 最后,我们再通过 show dbs 命令数据库是否删除成功:
?????????????? 5.2、删除集合
??????????????????? 集合删除语法格式如下:
??????????????????????? db.collection.drop()
??????????????????? 以下实例删除了 school 数据库中的集合 students:
> use school
switched to db school
> show tables
students
> show collections
students
> db.students.drop()
true
> show tables
> show dbs
admin .000GB
config .000GB
local .000GB
>
??????????????????? 将数据库中唯一的集合students删除了,该数据还存在,但是通过 show dbs 命令无法看到该数据库了。
???????? 6、MongoDB 的 db.help()帮助命令,显示db所具有的所有命令
# ./mongo
MongoDB shell version:
connecting to: mongodb:192.168.127.1:27017/test
MongoDB server version: 3
> db.help()
DB methods:
db.adminCommand(nameOrDocument)
db.aggregate([pipeline],{options})
db.auth(username,password)
db.cloneDatabase(fromhost)
db.commandHelp(name)
db.copyDatabase(fromdb,todb,fromhost)
db.createCollection(name,{size:...,capped:...,max:...})
db.createView(name,viewOn,[{$operator:{...}},...])
db.createUser(userDocument)
...
db.status()
db.version()
>
???????? 7、MongoDB 创建集合
?????????????? 7.1、MongoDB 中使用 createCollection() 方法来创建集合。
??????????????????? 语法格式:
??????????????????????? db.createCollection(name,options)
??????????????????????? db.collectionName.insert(document),如果collectionaName名字的集合不存在,就创建集合,并插入文档。如果存在该集合,就直接往集合中插入文档。
??????????????????? 参数说明:
??????????????????????? name: 要创建的集合名称
??????????????????????? options: 可选参数,指定有关内存大小及索引的选项
??????????????????? options 可以是如下参数:
??????????????????? 字段 ?? ????????????? 类型 ?? ? ? ???????? 描述
??????????????????? capped ?? ???????? 布尔 ?? ????????? (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
??????????????????? autoIndexId ?? ?? 布尔 ?? ????????? (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
??????????????????? size ?? ?????????????? 数值 ?? ????????? (可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。
??????????????????? max ?? ????????????? 数值 ?? ?????????? (可选)指定固定集合中包含文档的最大数量。
??????????????????? 在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
?????????????? 7.2.实例
??????????????????? 在 school 数据库中创建 students 集合:
> use school
switched to db school
> db.createCollection(students)
{ }
>
??????????????????? 如果要查看已有集合,可以使用 show collections 或者 show tables 命令:
> show collections
students
>
??????????????????? 下面是带有几个关键参数的 createCollection() 的用法:
??????????????????? 创建固定集合 myclass,整个集合空间大小 6142800 KB,文档最大个数为 10000 个。
> db.createCollection(myclasstrue,size : 6142800,max : 10000 } )
{ }
>
???????????????????? 在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
> db.classes.insert({PatrickLiu})
> show collections
classes
???????? 8、 MongoDB 删除集合
???????????????? 8.1、MongoDB 中使用 drop() 方法来删除集合。
????????????????????? 语法格式:
?????????????????????????? db.collectionName.drop()
????????????????????? 参数说明:
????????????????????????? 无
????????????????????? 返回值
????????????????????????? 如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
???????????????? 8.2、实例
????????????????????? 在数据库 school 中,我们可以先通过 show collections 命令查看已存在的集合:
>use school
switched to db school
>show collections
students
class
>
????????????????????? 接着删除集合 class :
????????????????????? 通过 show collections 再次查看数据库 school 中的集合:
>show collections
students
>
????????????????????? 从结果中可以看出 class 集合已被删除。 ???????????????
???????? 9、MongoDB 插入文档
?????????????? 文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。
?????????????? 9.1、MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
???????????????????? db.collectionName.insert(document) 插入单条文档
???????????????????? db.collectionName.insert([document1,document2,document3,...]) 插入多条文档
???????????????????? 如果 save() 语句没有指定 _id 字段,该功能类似 insert()方法的功能,是增加文档,如果指定了 _id 字段,就类似修改功能了。
???????????????????? db.collectionName.save(document) 插入单条文档
???????????????????? db.collectionName.save([document1,...]) 插入多条文档
?????????????? 9.2、实例1:insert()方法
????????????????????????? 以下文档可以存储在 MongoDB 的 school 数据库 的 students 集合中: ?????????????????? ?
insert()方法插入一条文档
>db.students.insert({name: 'HuangFeiHong',1)">32,school: })
WriteResult({1})
???????????????????????? 以上实例中 students 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
insert()方法插入多条文档
>db.students.insert([{name: FangShiYu22,1)">ZheJiangDaXueGuangDongGuangZhou"},{name: YanYongChun27,1)">0,1)">FuJianDaXueFuJianNanTianRen}])
BulkWriteResult({
writeErrors:[],writeConcernErrors2,1)">nUpsertednMatchednModifiednRemovedupserted?? 9.3、实例2:save()方法,在实现插入效果的时候,也不建议使用Save()方法,建议使用Insert()方法
save()方法插入一条文档
>db.students.save({name: HongXiGuan25,1)">GuangDongZhongShanDaXueGuangDongShanTou1})
???????????????????????? 以上实例中 students 是我们的集合名,我们可以通过 save() 方法来增加一条数据。
save()方法插入多条文档
>db.students.save([{name: HuangQiYing48,1)">LiangKuan24,1)">GuangDongHuiZhouDaXueGuangDongHuiZhou
>db.students.save({_id:ObjectId(5ab89c0d4f578f93b6feccef"),name: 28,1)">})
WriteResult({ 1})
??????????????????????? 更新记录成功,如果没有对应的 ID 值,也会增加记录。??????????? ?
???????? 10、MongoDB 更新文档:
????????????????? MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
??????????????? 10.1、update() 方法,用于更新已经存在的文档
?????????????????? ? ? ?? update() 方法用于更新已存在的文档。语法格式如下:
????????????????????????? db.collectionName.update( ????????????????????????????? <query>, ????????????????????????????? <update>, ????????????????????????????? { ???????????????????????????????? upsert: <boolean>, ???????????????????????????????? multi: <boolean>, ???????????????????????????????? writeConcern: <document> ?????????????????????????????? } ?????????????????????????? )
?????????????????????? 参数说明:
?????????????????????????? query : update的查询条件,类似sql update查询内where后面的。
???????????????????????? ? update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
?????????????????????????? upsert : 可选,这个参数的意思是,如果不存在update的记录,是否当新数据插入,true为插入,默认是false,不插入。
?????????????????????????? multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
?????????????????????????? writeConcern :可选,抛出异常的级别。
??????????????????????? 10.1.1、实例
> db.students.find()
{ _id" : ObjectId(5ab9d27e3afa6504457050ddagesexcollagehobbies" : [ kongfuYouYong" ],1)">address }
{ 5ab9d38a3afa6504457050df23,1)">HuaXueFuJian5ab9d38a3afa6504457050e0YeChuiFuJIanNaoSao5ab9d38a3afa6504457050e1MiaoCunHua36,1)">MeiRong" }
????????????????????????????????? 修改名称是“HuangFeiHong”的“age”为30,原始值是:33,默认只修改一条
>db.students.update({name:$set":{30}})
WriteResult({ })
>db.students.findOne()
{ 30,1)"> }
年龄已经从33岁改成了30岁了。
修改名别是1(男人)的年龄都是30,必须这样写
>db.students.update({1},1)">30}},{multi:true})
WriteResult({ 2,1)">2 })
?????????????? 10.2、save()方法(全文档字段替换,不是针对某个字段修改的,是伪更新)(修改数据的时候不使用Save()方法,使用Update()方法)
??????????????????????? save() 方法通过传入的文档来替换已有文档。语法格式如下:
??????????????????????? db.collection.save( ????????????????????????? <document>, ???????????????????????? { ?????????????????????????? writeConcern: <document> ??????????????????????? ? } ??????????????????????? )
???????????????????? 参数说明:
???????????????????????? document : 文档数据。
???????????????????????? writeConcern :可选,抛出异常的级别。
???????????????????????? 10.2.1、实例
修改一条记录,每个字段全部替换,好像是修改的效果
>db.students.save({
":ObjectId(),1)">33 : [
],1)">" :
})
WriteResult({ 1 })
???????? 11、MongoDB 删除文档
???????????????? MongoDB remove()函数是用来移除集合中的数据。
???????????????? MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
???????????????? 11.1、remove()函数是用来移除集合中的数据。
???????????????????? remove() 方法的基本语法格式如下所示:
???????????????????? db.collectionName.remove( ??????????????????????? <query>, ??????????????????????? <justOne> ????????????????????? )
???????????????????? 如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:
???????????????????? db.collectionName.remove( ??????????????????????? <query>, ??????????????????????? { ????????????????????????? justOne: <boolean>, ????????????????????????? writeConcern: <document> ??????????????????????? } ????????????????????? )
???????????????????? 参数说明:
??????????????????????? query :(可选)删除的文档的条件。
??????????????????????? justOne : (可选)如果设为 true 或 1,则只删除一个文档。
??????????????????????? writeConcern :(可选)抛出异常的级别。
??????????????? 11.2、实例
删除全部数据,{}不能省略
>db.students.remove({})
WriteResult({ 1 })当前只有一条记录了,会清空集合表
删除符合条件的数据是,所有符合的记录都删除
>db.students.remove({ })
删除符合条件的第一条数据
>db.students.remove({sex:1 })
????????? 12、MongoDB 文档查询
????????????????? 12.1、 MongoDB 查询数据的语法格式如下:
????????????????????? //查询符合条件的第一条文档 ????????????????????? db.collectionName.findOne(query,projection)
????????????????????? //查询符合条件的文档 ????????????????????? db.collectionName.find(query,projection)
????????????????????????? query :可选,使用查询操作符指定查询条件
????????????????????????? projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。格式如:key1:1,key2:1....,1表示显示,0表示不显示该键
????????????????????? 如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
???????????????????????? >db.col.find().pretty()
????????????????????? pretty() 方法以格式化的方式来显示所有文档。
??????????????? 12.2、实例
查询所有记录
>5ab9de223afa6504457050e25ab9de223afa6504457050e35ab9de3c3afa6504457050e4 }
显示符合条件的数据,当前显示性别是女的所有记录
> db.students.find({})
{ 显示符合条件的数据,并且可以控制显示的键
>db.students.find({sex:})
{ 显示符合条件的数据,以格式化的方式来显示所有文档
>db.students.find({sex:}).pretty()
{
22
}
{
32
}
显示符合条件的第一条数据,并且可以控制显示的键
>db.students.findOne({sex:})
{
}
四、总结
?????????? 今天就写到这里了,有关查询和更新的内容还很多,今天只是介绍一个大概的内容,让大家对MongoDB的操作有一个初步的印象。我们以后会用更多的章节介绍查询和跟新的内容,包括条件操作符,修改操作符,还有一些特殊的操作符,正因为这部分的内容很多,所以需要我们使用单独的章节来介绍其内容。不忘初衷,继续努力吧。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|