一、相同点(没有主键“_id”时):
当执行的SQL语句中没有主键“_id” 时,insert 和 save 的操作完成一致,没有什么区别。
db.stud.insert({name:"zhangsan",age:1});
db.stud.save({name:"zhangsan",age:1})
执行结果: 会增加两个数据,但是 _id不一样。
二、不同点(有主键“_id”时):
若新增的数据中有主键“_id” 时,insert() 会提示错误,而save() 则更新原来的内容为新内容。
例子:
数据库(集合中)中,已经存在一条数据,_id是 5bc29e3a09ec11608e9ccb92,如下
{"_id" : ObjectId("5bc29e3a09ec11608e9ccb92"), "name" : "zhangsan", "age" : 1}
当insert 、save的执行数据中 有_id 也是 5bc29e3a09ec11608e9ccb92 时,如:
db.stud.insert({_id:"5bc29e3a09ec11608e9ccb92",name:"lisi",age:2})
db.stud.save({_id:"5bc29e3a09ec11608e9ccb92",name:"wangwu",age:3})
依次执行,
insert 执行时,会抛出主键重复的错误,保存失败;
save 执行的是更新操作,更新后的数据是
{ "_id" : "5bc29e3a09ec11608e9ccb92", "name" : "wangwu", "age" : 3}
三、总结:
insert 可以理解 就是 插入 操作;如果主键存在,则抛异常;
save 可以理解为 插入或 更新;如果 _id 的值 存在就更新,不存在就插入。