数据操作前,需要先开启MongoDB服务,并建立链接。
开启服务
mongod
建立链接
mongo
数据插入
单条数据插入语法:
db.集合.insert()
批量数据插入实例:
demo1.js
var workmate1 = {
name: 'zhangsan',
age: 20,
sex: 1,
job: '前端',
skill: {
skillOne: 'HTML',
skillTwo: 'CSS',
skillThree: 'js'
},
regeditTime: new Date()
}
var workmate2 = {
name: 'lisi',
age: 30,
sex: 1,
job: '后端',
skill: {
skillOne: 'JAVA',
skillTwo: 'J2EE',
skillThree: 'ORACLE'
},
regeditTime: new Date()
}
var workmate3 = {
name: 'xiaohong',
age: 18,
sex: 0,
job: 'UI',
skill: {
skillOne: 'PS',
skillTwo: 'AI',
skillThree: 'PPT'
},
regeditTime: new Date()
}
var db = connect('company');
var workmateArr = [workmate1, workmate2, workmate3];
db.workmate.insert(workmateArr);
print('sucess');
在vscode终端中执行js文件:
1.使用mongo命令链接到数据库
2.使用load命令直接加载js文件
3.使用命令查询下插入的数据
一次性就将三条记录插入到数据库中。
数据修改
实例一:把姓名为xiaohong的记录,sex改为0,age改为20,操作如下:
新建demo2.js
db.workmate.update({ name: 'xiaohong' }, { "$set": { sex: 0, age: 20 } });
在vscode终端执行 load('./demo2.js')
修改后查询下最新的数据:
发现数据已经修改成功。
实例二:把姓名为xiaohong的记录,skillThree的值由原来的PPT改为Word。
db.workmate.update({ name: 'xiaohong' }, { $set: { "skill.skillThree": "Word" } });
执行结果:
实例三:为姓名为xiaohong的记录,添加字段address,值为上海市。
db.workmate.update({ name: 'xiaohong' }, { $set: { address: "上海市" } });
执行结果:
实例四:为姓名为xiaohong的记录,删除字段address。
db.workmate.update({ name: 'xiaohong' }, { $unset: { address: '' } });
执行结果:
可以看到address字段已经被删除了。
实例五:为姓名为xiaohong的记录,age字段值减2。
db.workmate.update({ name: 'xiaohong' }, { $inc: { age: -2 } });
执行结果:
从结果可以看到,age由原来的20改成了18。
实例六:为workmate集合中的所有记录添加字段address,值为上海市。
db.workmate.update({}, { $set: { address: "上海市" } }, { multi: true });
执行结果:
实例七:为name等于wangwu的记录,设置age等于40。
这时候因为数据库中并没有wangwu的记录,在不使用insert命令新增wangwu记录的情况下,可以使用upsert来实现不存在的记录新增的操作。
db.workmate.update({ name: "wangwu" }, { $set: { age: 40 } }, { upsert: true });
执行结果:
可以看到新增了一条name为wangwu的记录,age字段值为40
实例八:为name等于wangwu的记录,添加兴趣爱好字段(interest),值为画画(draw)。
db.workmate.update({ name: "wangwu" }, { $push: { interest: 'draw' } });
执行结果:
使用push方法可以往数组中添加元素。
实例九:为name等于wangwu的记录,兴趣爱好字段(interest),添加值(read)。要求:如果interest中不存在read元素,则添加。存在则不添加。
db.workmate.update({ name: "wangwu" }, { $addToSet: { interest: 'read' } });
执行结果:
可以看到第一次执行的时候,interest数组中不存在read元素,所以新加进去了,第二次执行时,因为已经存在了,所以并没有重复添加。addToSet可以轻松实现添加前判断的功能。
实例十:为name等于wangwu的记录,兴趣爱好字段(interest),添加多个值。要求:如果interest中不存在的元素,则添加。存在则不添加。
var newArr = ["Sing", "Dance", "Code"];
db.workmate.update({ name: "wangwu" }, { $addToSet: { interest: { $each: newArr } } });
执行结果:
可以看到一次性将三个元素同时插入都interest数组中。$each 实现批量追加功能。
实例十一:为name等于wangwu的记录,兴趣爱好字段(interest),删除Code元素。
db.workmate.update({ name: 'wangwu' }, { $pop: { interest: 1 } });
执行结果:
$pop只删除一次,并不是删除所有数组中的值。而且它有两个选项,一个是1和-1。
1:从数组末端进行删除
-1:从数组开端进行删除
实例十二:为name等于wangwu的记录,兴趣爱好字段(interest),Sing元素修改为Sport。
db.workmate.update({ name: 'wangwu' }, { $set: { "interest.1": "Sport" } });
执行结果:
字段名称.元素下标
db.runCommand()的使用:
在上面的实例中,当执行修改操作后,并不知道是否执行成功。数据库并没有返回执行结果。如果想在语句执行后的到数据库返回的结果,可以使用db.runCommand()来接收数据库返回的信息。
它是数据库运行命令的执行器,执行命令首选就要使用它,因为它在Shell和驱动程序间提供了一致的接口。(几乎操作数据库的所有操作,都可以使用runCommand来执行)现在我们试着用runCommand来修改数据库,看看结果和直接用db.collections.update有什么不同。
实例十三:为sex等于1的记录,添加money,值为1000。
db.workmate.update({ sex: 1 }, { $set: { money: 1000 } }, false, true);
var resultMsg = db.runCommand({ getLastError: 1 });
printjson(resultMsg);
false:第一句末尾的false是upsert的简写,代表不符合条件sex=1时不增加;
true:第一句末尾的true是multi的简写,代表修改所有符合条件的记录。
getLastError:1 :表示返回功能错误,这里的参数很多,可以通过db.listCommands()查看所有的Commad命令。
printjson:表示以json对象的格式输出到控制台。
执行结果:
可以看到本次执行后,打印了很多信息。在实际应用场景中可以根据这些返回的结果进行其他的逻辑处理。
查询下执行后的数据情况:
只有sex值为1的记录,才增加了 money: 1000 的数据。
findAndModify:
从名字上就可以看出,findAndModify是查找并修改的意思。配置它可以在修改后给我们返回修改的结果。通过下面的实例感受下用法。
实例十四:为name等于wangwu的记录,修改年龄为33,并返回修改后的记录。
var myMidify = {
findAndModify: "workmate",
query: { name: "wangwu" },
update: { $set: { age: 33 } },
new: true
}
var resultMsg = db.runCommand(myMidify);
printjson(resultMsg);
执行结果:
可以看到age被修改为33,并返回了name等于wangwu的所有信息。
findAndModify属性值:
query:需要查询的条件/文档
sort: 进行排序
remove:[boolean] 是否删除查找到的文档,值填写true,可以删除
update:更新的字段和值。(remove和update不能同时存在)
new:[boolean] 返回更新前的文档还是更新后的文档
fields:需要返回的字段,默认返回全部字段
upsert:没有这个值是否增加