在上一篇文章中,我们介绍了MongoDB。现在,我们来看下如何在MongoDB中进行常规的CRUD操作。毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作。
MongoDB中的增删改查操作,不同于我们熟悉的关系数据库中的操作。在关系数据库中,比如MySQL,我们通常使用SQL语句对数据库进行增(INSERT)删(DELETE)改(UPDATE)查(SELECT)。MongoDB在对数据进行操作过程中,使用的是Document进行数据操作。在对数据库进行操作的时候,使用Document来表示需要查询的条件和需要更新的数据,功能类似于关系数据库中的SQL语句。接下来,我们来看下在MongoDB中是如何通过Document来进行CRUD操作的。
注意:下面介绍的CRUD操作,是在MongoDB的mongo shell操作的。mongo shell是一个JavaScript交互环境,是MongoDB提供的一个客户端。不同的语言有自己对应的驱动和对应的操作API,但是原理是类似的。相信通过在mongo shell中进行CRUD操作的介绍,大家也可以举一反三,在不同的语言中操作MongoDB。
2. INSERT操作MongoDB中的新增操作,把一个新的Document插入到一个Collection中。
如果该Collection不存在,则新增一个新的Collection。这个和关系数据库有很大的区别,在关系数据库中,我们需要定义数据库的schema和表结构,这是NoSQL(MongoDB是NoSQL的一种)数据库和关系数据库很大的区别。在MongoDB中,我们可以在一个Collection中包含多个不同结构的Document(不推荐这样做,一个Collection最好具有相同格式的Document,便于维护和使用)。
关于"_id"字段,当我们新增一个Document到Collection中的时候,MongoDB需要每一个新增的Document中有一个"_id"字段,MongoDB把这个字段作为主键,所以要求这个字段在Collection中是唯一的。如果新增的Document中没有包含"_id"字段,那么MongoDB的客户端会在该Document中新增一个值为ObjectId类型的"_id" 字段;如果MongoDB服务在新增Document的时候发现Document中没有"_id"字段,那么mongod会新增一个值为ObjectId类型的"_id"字段到该Document中。
MongoDB对单个Document的写操作是原子的。
MongoDB提供了如下的方式来进行新增操作:
db.collection.insert()
db.collection.insertOne() 3.2版本新增
db.collection.insertMany() 3.2版本新增
2.1 db.collection.insert()insert操作可以新增单个Document,也可以新增多个Document。如果新增单个Document,则把需要新增的Document作为参数传递给insert(),如果新增多个Document,则将多个Document的数组作为参数传递个insert()函数。
比如我们需要在"post"这个collection上新增一个Document来表示我们的博客中新增了一篇文章,我们可以这么做:
现在,我们给post这个Collection新增了一个Document,表示在Blog中新增了一篇文章。我们可以看下现在post这个Collection中是不是有我们新增的Document。
这里我们使用findOne()来查询,我们可以看到,我们由于没有在Document中包含"_id"字段,所以MongoDB自动为我们新增了一个"_id"字段。
insert()函数可以一次新增多个Document,只要将一个Document的数组传递给insert()就可以了,如:
2.2 db.collection.insertOne()
insertOne()函数是在3.2版本中新增的,它用来添加单个Document。例子如下:
2.3 db.collection.insertMany()insertMany()函数是insert的批量增加的版本,支持一次新增多个Document,它也是3.2版本中新增的函数:
好了,我们简单介绍了下insert操作的三个函数,下面,我们已经在MongoDB的数据库里新增了几个Document了。接下来,是时候开始学习查找操作来查看这些已经存储在MongoDB的记录了。
3. QUERY操作MongoDB提供了db.collection.find()函数来执行查询操作,函数将返回一个游标(cursor),用于遍历查询到的Documents。find()函数接受两个参数,一个是过滤条件,还有一个是投影。
db.collection.find( <query filter>, <projection> )
<query filter>用于查找满足过滤条件的Document
<projection>(投影)用于指定被找到的Document中需要返回哪些字段,用于限制网络中传输的数据的大小。投影的概念和关系数据库中的投影的概念基本是一致的。
现在,我们可以查询下刚才我们新增的所有的Documents,通过find(),我们来看下如何查询:
如果我们没有传递任何参数,或者传递一个"{}"给find()函数,那会find()返回Collection中所有的Document。现在,可以看到我们刚才新增的所有的Documents。
接下来,我们通过指定条件,查询标题为"Third Post"的Document,我们可以这样做:
发现了么,我们的查询条件其实就是以Document方式构造的。在MongoDB中,我们可以通过构造不同的Document来定义不同的查询条件。