6、 如何进行插入 操作?
在MongoDB中可以通过下面三种方式向数据库插入数据:
所有的插入操作遵循以下规则:
文档属性名称必须遵循下面的约定:
6.1 insert方式
语法格式:db.collection.insert(<document>)
如果指定的集合不存在,则自动创建该集合。(可以通过show collections 命令查看集合)。
例如:在mongo控制台中输入:
>db.zyv.insert({});
可以通过命令
>show collections;
可以看到:
system.indexes
zyv
系统自动创建了集合zyv,输入:
db.zyv.find();
显示为:
{ "_id" : ObjectId("50c4a26eab52e8ff5a25ad28") }
成功插入了一条记录,由于我们输入了一个空的对象{},数据库自动创建了_id属性,值为24位字符串的ObjectId。
批量插入:当insert的参数为数组时,mongodb将自动插入数组中的所有文档到集合中。如:
db.zyv.insert([{_id:1},{_id:2},{_id:3}]);
将会插入3条文档到集合中。批量插入减少了TCP连接的次数,理论上会大大提高插入的效率。
6.2 save方式
语法格式:db.collection.save(<document>)
如果传入的document没有指定_id属性,或者_id的值在数据库中不存在,则自动插入新增到数据库中。这个方法使得修改一系列值的操作变得非常方便。例如,假设我们要维护一个人的简历,在擅长开发语言一栏里面有c、c++、java、c#、javascript、Object-c等,用户先前选择的是c#和java,后来修改为c#和object-c,如果用常用的关系数据库的关联表存储,在更新之前必须去判断,做一次删除(java)和新增(object-c)的操作,而如果使用mongodb数据库的话,一个save就搞定了。
6.3 upsert方式
在save方法中,数据库判断_id是否存在来决定更新还是插入;而upsert更进一步,它可以指定一个查询条件来决定更新还是插入,这个更是强大,不愧是update和insert的合体。
语法格式:db.collection.upsert(<search>,<update>,{upsert:true});
如果没有文档满足<search>参数,则插入<update>文档,如果<update>中没有指定_id,则自动生成_id;如果有文档满足<search>,则更新(新增或修改)<update> 参数中包含的属性和值。
需要注意的是,因为MongoDB 的写(插入、更新、删除)操作都是“瞬时完成”的,所以如果插入出现错误,并不会在调用insert(object) 后直接返回,需要用getLastError() 去获得。因此,客户端需要做更多的校验工作。事实上,使用关系数据库的时候,我们的数据规则校验,大部分也都是在客户端去校验完成,很少程序会去直接分析数据库的ErrorCode 来响应用户的。数据库的校验只是作为最后的屏障,保证在应用系统“疏忽”的情况下,仍然能保证数据的正确性。从这里也能看出,NoSQL 数据库对应用程序的要求其实更高了,如果一个数据模型设计或开发的bug 在系统上线N 久后才发现,数据的恢复或变更将会导致一场灾难。数据库给了我们最大的自由,但我们开发应用时仍要非常小心。