MongoDB的CRUD操作简析(3)

MongoDB提供了丰富的操作符来支持构造灵活的过滤条件,这里就先介绍这么点。由于篇幅关系,这里就不再展开了,下次独立写篇文章重点介绍下MongoDB中的查询操作。接下来,我们该看下如何在MongoDB中进行更新操作。

4. UPDATE操作

MongoDB也支持基本的更新操作,它提供了4个用于更新的方法:

db.collection.updateOne() 3.2版本新增

db.collection.updateMany() 3.2版本新增

db.collection.update()

db.collection.replaceOne() 3.2版本新增

这些Update方法支持三个参数:

用于筛选记录的过滤条件,过滤出需要被更新的记录,过滤条件和query中使用的过滤条件类似。

一个新的Document,用于更新部分值或者替换除了"_id"之外的一整个Document。

一个以Document格式组织的一组更新选项。

MongoDB对于单个Document的更新操作是原子的。 MongoDB在更新时对于"_id"主键的处理原则是,不管是更新还是替换Document,都不能更改被更新的Document的"_id"主键,如果在替换的时候包含了不同的"_id",那么替换会失败,如:

MongoDB的CRUD操作简析

上面的例子中,我们修改了原先的"_id"值为1,然后进行替换更新,发现更新失败,提示"_id"值不能被更改。

当我们更新的时候,新的Document的大小超过了原先旧的Document的大小的时候,更新操作会重新申请一块更大的空间来存放这个新的Document。

接下来,我们来看下这些更新API的用法。

4.1 db.collection.updateOne()

updateOne()函数是在3.2版本中新增的一个API,用于更新一条匹配到的Document。现在我们需要更新我们的Post集合中的标题为"First Post"的Document,我们想增加一些评论,我们可以这么构造我们的更新表达式:

db.post.updateOne({"title": "First Post"}, {"$set": {"comments": ["comment one"]}})

MongoDB的CRUD操作简析

现在,我们的"First Post"这篇文章就有了一条评论了。这里我们使用"$set"操作符来设置一个新的字段,MongoDB的更新操作提供了一些有用的操作符来帮助构造更新语句。updateOne()函数会更新第一个被匹配到的Document。如果要更新多个Document,我们可以用updateMany()函数来支持。

4.2 db.collection.updateMany()

updateMany()函数可以对匹配到的所有的Document进行更新操作。比如我们想更新所有的文章,让每篇文章都有一个浏览数的字段,表示别浏览的次数。我们可以这样做:

db.post.updateMany({}, {"$set": {"view": 0}})

MongoDB的CRUD操作简析

我们可以看到,通过updateMany()函数,我们更新了所有的Document,使得每个Document都包含了一个"view"字段,初始值为0。

4.3 替换Document

上面提到了两个API,都是对Document中的某个字段进行更新。它们除了可以对Document中的单个字段进行更新外,还可以对匹配到的整个Document进行替换(除了"_id"属性外,可以替换任何属性)。只要把更新参数改成一个普通的Document(Document的结构中不包含操作符),就可以对匹配到的Document替换成参数中的Document。进行Document替换更新的时候,需要注意:原先的Document中的"_id"属性是不能被更改的,所以新的用于替换的Document不能包含"_id"属性,如果包含了"_id"属性,那么这个"_id"属性必须是和被更新的Document的"_id"属性是相同的。

除了上面的两个API可以用于替换Document,MongoDB在3.2版本中新增了一个replaceOne()函数来进行替换操作。现在我们用replaceOne()来替换一个Document,我们把"title"是"First Post"的Document替换成新的Document:

db.post.replaceOne({"title": "First Post"}, {"title": "New Post", "content": "new content", "create_time": new Date()})

MongoDB的CRUD操作简析

现在,我们已经把"title"为"First Post"的Document替换为了新的"title"为"New Post"的Document了。

最后,我们来看下上面三个API的集大成者,就是update()函数,它基本包含了上面提到的三个API的所有功能,默认情况下,update()函数会更新匹配到的第一个Document,如果设置了"multi"选项,那么就可以更新匹配到的所有的Document。 

下面我们使用update()来更新匹配到的第一个Document: 

db.post.update({"title": "New Post"}, {"$set": {"view": 0}})

MongoDB的CRUD操作简析

好了,更新操作介绍到这里,接下来就是最后一个删除操作了。

5. DELETE操作

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27493bd5b522dfa6f9b08845f484494a.html