MongoDB学习笔记(二)——CRUD之 插入

6、 如何进行插入 操作?

 在MongoDB中可以通过下面三种方式向数据库插入数据:

  • Insert方式
  • Save方式
  • Upsert方式

所有的插入操作遵循以下规则:

  • 如果没有指定_id属性,则自动生成一个ObjectId类型的唯一的_id;如果指定了_id,则_id的值必须在集合中唯一,否则将报异常;
  • 最大的BSON文档为16M(MongoDB2)。可以通过GridFS API存储更大的文档

文档属性名称必须遵循下面的约定:

  • 主键  _id:集合中唯一,可以是除数组外的任何格式;
  • 不能以字符$开始;
  • 不能包含字符.(小圆点)

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 久后才发现,数据的恢复或变更将会导致一场灾难。数据库给了我们最大的自由,但我们开发应用时仍要非常小心。

猜你喜欢

转载自zhiyongv.iteye.com/blog/1742823