MongoDB基础知识
-
一、基础概念
1、文档(document)是MongoDB中数据的基本单元,非常类似于关系型数据库管理系统中的行
2、集合(collection)可以看做是一个拥有动态模式(dynamic schema)的表
3、MongoDB的一个实例可以拥有多个相互独立的数据库,每一个数据库拥有自己的集合
4、每一个文档都有一个特殊的键"_id",这个键在文档所属的集合中是唯一的
5、MongoDB自带JavaScript shell,可用于管理MongoDB的实例或数据操作
MongoDB概念 database 数据库 collection row 行/文档 field index 索引 primary key primary key 主键,MongoDB自动将_id字段设置为主键 从上表中的区别,能够让我们更好的理解和记忆MongoDB的一些基础概念术语。
二、shell 基础操作
1、新增
//创建新的数据库 MongoDB Enterprise > use db_test switched to db db_test //新增集合并插入数据 MongoDB Enterprise > db.col_test.insert({"no":"F1","name":"Jack"}) WriteResult({ "nInserted" : 1 })
注意insert()和save()方法使用的区别,上次在文章分享中有提到过,如果忘了,请看回之前的文章,
当然还有很多关于insert的操作,如insertOne()、insertMany()等,具体的可以自己多加操作,在此就不逐个解释说明了。
2、查询
我们使用find()和findOne()方法来查询数据库集合中的数据
MongoDB Enterprise > db.col_test.find() { "_id" : ObjectId("5ae27fa6f8dee951b3c28b05"), "no" : "F1", "name" : "Jack" } { "_id" : ObjectId("5ae282c7f8dee951b3c28b06"), "no" : "F2", "name" : "Lily" } //findOne()只查询1个文档 MongoDB Enterprise > db.col_test.findOne() { "_id" : ObjectId("5ae27fa6f8dee951b3c28b05"), "no" : "F1", "name" : "Jack" }
find()查询的时候最多显示20个匹配的文档,然后会提示:“Type "it" for more”,输入“it”就会再显示出来,如此类推循环显示出来。
{ "_id" : ObjectId("5ae29d2b22077c36eb24d438"), "no" : "F40", "name" : "Mike18" } Type "it" for more MongoDB Enterprise > it { "_id" : ObjectId("5ae29d2b22077c36eb24d439"), "no" : "F11", "name" : "Mike19" } { "_id" : ObjectId("5ae29d2b22077c36eb24d43a"), "no" : "F31", "name" : "Mike20" }
3、更新文档
文档插入数据库以后,就可以使用update()方法来更新,update()接受至少两个参数:
第一个是限定条件(用于匹配待更新的文档);第二个是新的文档,用于说明要对找到的文档进行哪些修改。
更新操作是不可分割的:若是两个更新同时发生,先到达服务器的先执行,接着执行另一个。
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
举个例子,我们先在集合中插入1笔记录,然后通过 update() 方法来更新
MongoDB Enterprise > db.col_test.findOne() { "_id" : ObjectId("5ae27fa6f8dee951b3c28b05"), "no" : "F1", "name" : "Jack" } MongoDB Enterprise > db.col_test.update({"name":"Jack"},{$set:{"name":"Mike"}}); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) MongoDB Enterprise > db.col_test.findOne() { "_id" : ObjectId("5ae27fa6f8dee951b3c28b05"), "no" : "F1", "name" : "Mike" }
4、删除
使用remove()可将文档从数据库中永久的删除,如果没有使用参数匹配,那么则会删除集合内的所有文档。它可以接受一个作为限定条件的文档作为参数。
remove()不会删除集合本身,也不会删除集合的元信息
//删除test集合中指定的文档 MongoDB Enterprise > db.test.find() { "_id" : ObjectId("5ae2cf7322077c36eb24d44f"), "no" : "F01", "name" : "Jack" } { "_id" : ObjectId("5ae2cfb322077c36eb24d450"), "no" : "F02", "name" : "Lucy" } MongoDB Enterprise > db.test.remove({"no":"F01"}) WriteResult({ "nRemoved" : 1 }) MongoDB Enterprise > db.test.find() { "_id" : ObjectId("5ae2cfb322077c36eb24d450"), "no" : "F02", "name" : "Lucy" } //删除集合内的所有文档 MongoDB Enterprise > db.test.find() { "_id" : ObjectId("5ae2cfb322077c36eb24d450"), "no" : "F02", "name" : "Lucy" } MongoDB Enterprise > db.test.remove({}); WriteResult({ "nRemoved" : 1 })
删除集合内所有的文档后,查看下数据已经没有,但是该集合还存在,
若要删除集合,则使用drop函数,db.test.drop()把整个test集合给删掉,集合里的文档以及元数据都会删除,再用show tables查看时,不会再显示刚刚出现的集合
MongoDB Enterprise > show tables col_test test MongoDB Enterprise > db.test.drop(); true MongoDB Enterprise > show tables col_test
三、数据类型
null:用于表示空值或者不存在的字段 {"x":null}
布尔型:布尔型有两个值true和false {"x":true}
数值:shell默认使用64位浮点型数值 {"x":3.14} or {"x":3}
对于整型值,可使用NumberInt类(表示4字节带符号整数) {"x":NumberInt("3")}
NumberLong类(表示8字节带符号整数) {"x":NumberLong("3")}
字符串:UTF-8字符串都可以表示为字符串类型的数据 {"x":"foobar"}
日期:日期被存储为自新世纪元以来经过的毫秒数,不存储时区 {"x":new Date}
正则表达式:查询时,使用正则表达式作为限定条件 {"x":/foobar/i}
数组:数据列表或数据集可以表示为数组 {"x":["a","b","c","d"]}
内嵌文档:文档可嵌套其他文档 {"x":{"foo":"bar"}}
对象id:对象id是一个12字节的ID,是文档的唯一标识四、总结
MongoDB的基础知识我们还是要熟悉,在日常操作过程中可以避免出现一些不必要的报错,提高工作效率,越是基础的知识,越不能粗心大意,
相信掌握了MongoDB的基础知识后,再深入了解MongoDB就不会有太大的问题。