应答式写入
在动手学习代码之前,我们先来了解一个概念:应答式写入。在以前的文章中,我们的操作都是非应答式写入,就是在操作完数据库后,它并没有给我们任何的回应和返回值,而是我们自己安慰自己写了一句话(print(‘[update]:The data was updated successfully’);)。这在工作中是不允许的,因为根本不能体现我们修改的结果。
应答式写入就会给我们直接返回结果(报表),结果里边的包含项会很多,这样我们就可以很好的进行程序的控制和安全机制的处理。有点像前端调用后端接口,无论作什么,后端都要给我一些状态字一样。
db.runCommand( )
它是数据库运行命令的执行器,执行命令首选就要使用它,因为它在Shell和驱动程序间提供了一致的接口。(几乎操作数据库的所有操作,都可以使用runCommand来执行)现在我们试着用runCommand来修改数据库,看看结果和直接用db.collections.update有什么不同。
db.workmate.update({sex:1},{$set:{money:1000}},false,true)
var resultMessage=db.runCommand({getLastError:1})
printjson(resultMessage);
上边的代码,我们修改了所有男士的数据,每个人增加了1000元钱(money),然后用db.runCommand()执行,可以看到执行结果在控制台返回了。
{
"connectionId" : 1,
"updatedExisting" : true,
"n" : 2,
"syncMillis" : 0,
"writtenTo" : null,
"err" : null,
"ok" : 1
}
- false: 第一句末尾的false是upsert的简写,代表没有此条数据时不增加
- true: true是multi的简写,代表修改所有
- getLastError: 1:表示返回功能错误
- printjson: 表示以json对象的格式输出到控制台
db.listCommands( ):查看所有的Commad命令。
比如我们要查看是否和数据库链接成功了,就可以使用Command命令。
db.runCommand({ping:1})
返回ok:1就代表链接正常。
findAndModify
从名字上就可以看出,findAndModify是查找并修改的意思。配置它可以在修改后给我们返回修改的结果。我们先看下面的代码:
var myModify={
findAndModify:"workmate",
query:{name:'jspan'},
update:{$set:{age:18}},
new:true //更新完成,需要查看结果,如果为false不进行查看结果
}
var ResultMessage=db.runCommand(myModify);
printjson(ResultMessage)
findAndModify的性能是没有直接使用db.collections.update的性能好,但是在实际工作中都是使用它,毕竟要商用的程序安全性还是比较重要的。
findAndModify属性值
- query: 需要查询的条件/文档
- sort: 进行排序
- remove: [boolean]是否删除查找到的文档,值填写true,可以删除
- new: [boolean]返回更新前的文档还是更新后的文档
- fields: 需要返回的字段
- upsert: 没有这个值是否增加