这篇博文主要学习mongodb中的Document的数据更新操作。包括了数据的”插入”,”更新”和”删除”。

Document数据插入

插入一条数据到document文档中用到的命令是”db.集合名称.insert(on=bj)” ,如图:

mongodb的xml文件 mongodb的document_nosql


从图中可以看出在我插入一条数据之后,再次查询发现确实添加到集合中了。那么如果我需要批量插入数据应该怎么操作呢??我们在之前已经说过了,mongodb的客户端shell实际上就是一个JavaScript引擎。因此我们可以通过for循环来执行操作。

mongodb的xml文件 mongodb的document_数据_02


如上图,我通过for循环实现批量插入数据的效果。

注意:
在mongodb中的插入中还存在一个save方法,那么他和insert方法的区别在哪里呢??什么时候该用save,什么时候又该用insert呢??
在我们进行插入操作的时候,如果使用save方法的时候,遇到”_id”相同的情况下save方法完成的是保存操作,如果使用insert方法,则会出错。

Document数据删除

删除列表中的所有数据

如果我需要删除列表中的所有数据,我可以这样写:

db.students.remove({})


mongodb的xml文件 mongodb的document_mongodb的xml文件_03


注意这样只是删除了数据,索引并没有删除。

根据条件删除数据:

如果需要根据条件删除集合中的数据,可以这样写:

db.students.remove({条件})


mongodb的xml文件 mongodb的document_nosql_04


可以看到,我首先添加了两条数据,然后删除age=11的那条数据,再次重新查询发现确实被删除了。

Update操作

update方法,顾名思义,就是当我执行该方法的时候,会首先根据该方法的查询条件进行查询,如果查询到了,则执行更新操作,如果没有查询到,则执行插入操作。

语法:db.集合名称.update({查询器},{修改器},true)

mongodb的xml文件 mongodb的document_数据_05


注意,如果想要让update方法有这样的特性,那么必须第三个参数填写上true。

可以看到当我的第三个参数设置为true的时候,此时,当我更新一个age=33的数据,没有查找到该数据的时候,会执行插入操作。注意:

如果我利用update方法来更新数据的时候,如果此时有多条数据满足查询器,mongodb只会默认为我们更新第一条数据。比如:

mongodb的xml文件 mongodb的document_数据_06


从图中可以看出:我更新name=”wangwu”的数据,发现只有第一条满足条件的数据更新了,那么如果我需要批量更新,应该怎么操作呢??

可以这样写:

db.students.update({查询条件},{$set:{更新数据}},是否insertOrUpdate,是否批量更新)

可以看到这里用到了$set修改器。如下图:

mongodb的xml文件 mongodb的document_mongodb的xml文件_07

mongodb修改器

mongodb为我们提供了很多修改器,用来实现数据的修改操作,下面是我在网上找到的一张关于mongodb的修改器。

mongodb的xml文件 mongodb的document_数据_08

$set:用来指定一个键值对,如果存在则修改,如果不存在则进行添加操作。如下图:

mongodb的xml文件 mongodb的document_nosql_09


根据图片,我首先为name=”xiaoming”的更新一个age=44的数据,这个时候由于该条数据没有这个age键,所以会为该条数据添加age=44的键值对, 然而当我为name=”lisi”的数据设置age=25的时候,由于该条数据已经有了age这个键,所以会更新该键值对。$inc:用来为指定的键对应的数字类型的数值进行加减操作,如下图:

mongodb的xml文件 mongodb的document_mongodb的xml文件_10


从图中,可以看出,我为name=”xiaoming”的这条数据,利用$inc修改器来将该条数据的age键的值+2,如果需要减去2,则填写-2即可。$unset:删除指定的键,如下图:

mongodb的xml文件 mongodb的document_数据_11


可以看到,我们将name=”xiaoming”的这条数据的age这个键成功去掉了。$push修改器

$push修改器:

1.如果指定的键是数组,则追加新的数值。

2.如果指定的键不是数组,则中断当前操作。

3.如果不存在指定的键,则创建数组类型的键值对。

mongodb的xml文件 mongodb的document_数据_12


此时我利用$push修改器分别执行两次更新操作,第一次,没有scores这个键,所以创建了一个数组类型的键值对,第二次,由于已经存在这个键,所以会继续追加。$pushAll修改器

pushAll修改器的用法和push修改器比较相似,他是用来批量的添加数组数据,比如我需要给name=”xiaoming”的文档中添加一个fruits[apple,orange,watermalon]这样的数据,

mongodb的xml文件 mongodb的document_数据_13

$addToSet修改器

$pushAll:当数组中存在需要添加的值,则什么都不做,如果数组中没有需要修改的值,则进行添加操作。

mongodb的xml文件 mongodb的document_nosql_14


可以看到,当我第一次通过$addToSet修改器,为scores数组添加值为100的数据,由于已经存在这个值,所以什么都没有做,当我第二次添加值是88的数据,此时会添加进去。$pop修改器

$pop修改器:从指定的数组中删除一个值:1表示最后一个值,-1表示第一个值。

mongodb的xml文件 mongodb的document_mongodb_15


可以看到,当我删除fruits数组中的数据,1表示删除最后一个,-1表示删除第一个。$pull修改器

$pull修改器:用来删除一个指定的数值

mongodb的xml文件 mongodb的document_数组_16


我在这里,在执行$pull修改器删除fruits中orange这个值得前后,分别执行了”db.student.find()”发现已经成功删除。$pullAll修改器

$pullAll修改器:用来删除数组中所有的数据

mongodb的xml文件 mongodb的document_mongodb的xml文件_17

addToSet和each结合完成批量更新数组

mongodb的xml文件 mongodb的document_数组_18


从图中,可以看出,我each会循环后面的每一个数组,把每一个数值进行addToSet操作。runCommand函数和findAndModify函数

runCommand可以执行mongoDB中的特殊函数 
 findAndModify就是特殊函数之一,用于返回update或remove后的文档。格式如下: 
 runCommand({“findAndModify”:”集合名称”, 
 query:{查询器}, 
 sort:{排序}, 
 new:true, 
 update:{更新器}, 
 remove:true 
 }).value

mongodb的xml文件 mongodb的document_nosql_19


可以看到我执行了runCommand方法,修改“students”集合中age==25的文档,为该文档添加了一个phone键值对。

可是大家注意:findAndModify一次只能操作一个文档,不能完成批量的更新操作。

ok,今天关于mongodb中document数据的操作部分,就学习到这里了。