码迷,mamicode.com
首页 > 数据库 > 详细

MongDB_插入详解

时间:2015-08-18 14:24:23      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

insert_api

1,结构

db.collection.insert(
   <document or array of documents>,
   {
     writeConcern: <document>,
     ordered: <boolean>
   }
)
名称 类型 说明?
document or docuemnts
document
需要插入的数据?
writeConcern document 2.6版新功能  安全写入?
ordered boolean 2.6版新功能  有序插入文档


2,返回值

    WriteResult({nInsert:1}); nInsert表示插入的个数,如果插入失败   则会返回具体原因


3,参数-文档/数组

        MongDB和mysql一样可以执行单文档和多文档插入;区别在于一个传入json元素文档对象,一个传入json数组元素文档对象;

        db.ccc.insert({name:"zg",age:25,sex:1});

        db.ccc.insert([

                                {_id:1,name:"a",age:11},

                                {name:"a",sex:11},

                                ])

        注:上面两条语句可以看出MongDB的几个特色

                        1,在插入的时候 如果集合不存在 则直接创建集合; 在实际应用中 mysql会需要创建表;

                        2,字段变化 随时可行   

                        3,_id 字段   这个字段非常重要,我们的查询优化的话主要是靠这个了;可指定  保证集合唯一

                        4,option 的parameter 采用json风格

                        

4,参数-安全写入

        案例:

        MongDB的写入/更新操作都有一定的机制;我们先看一个UML时序图

技术分享

     分析:Driver就是我们驱动(和JDBC连接的); MongDB就是我们数据库模型;

                1,Driver发起插入操作指令和发送数据;

                2,MongDB接收到数据,开始执行操作;

                3,Driver发起获得执行操作异常的指令;

                4,MongDB返回给异常集文档;

                5,MongDB对操作数据开始Apply操作(生效);

        总结:1,执行一个插入操作 会在Driver和DB之间有几个必不可少的步骤   发送操作指令   发送数据   DB执行    获取异常集文档  操作文档生效;

                  2,无论我们操作在那一步   如果DB不执行Apply操作   那么数据始终是无效的的;可以理解为事务提交失败回滚了;

                  3,driver始终会调用getLastError 但是是否返回error取决于 writeConcern的级别设置

    上面的时序图就是 writeConCern:0的执行时序图;driver调用了getLastError()之后,mongod立刻返回结果,然后才开始Apply。所以getLastError()的返回值一定是null,即使之后的Apply发生了错误,driver也不知道。使用这个级别的write concern,driver的写入调用立刻返回,所以性能是最好的,但是可靠性是最差的,因此并不推荐使用。在各平台最新版本的driver中,也不再以0作为默认级别。其实还有一个w:-1的级别,是error ignored,基本上和w:0差不多。-1不捕捉任何错误  0捕捉netWork错误;

    writeConCern我们暂且叫“写关注” ;写关注主要作用是在操作性能和数据安全性之间的抉择;


     writeConCern:1

技术分享

    分析:当写关注为1的时候;我们发送的请求的响应是在apply操作之后,这样如果数据真实存储开始请求到真实存储之间发生任何错误都会捕捉返回给LastError文档;这样数据存储才会有可靠性;但是由于是在apply之后,所以操作性能(应用性能不能MongDB性能)就会下降;此方式 是MongDB默认的writeConcern级别


    writeConcern:1&j:true(j jouranl)         

    技术分享

        分析:有些人认为write:1是数据安全的;但是其实不然;MongDB的apply其实是把数据写入到内存中;内存中的数据都是瞬时数据,非持久化数据;MongDB采用的是先把数据写入到内存中然后按照一定的策略sync到硬盘;(可配置 后面介绍);当我们writeConcern:1 我们会把数据写入到内存  但是内存数据是否sync到硬盘我们不得而知;上面时序图助攻的write to journal的作用就是把数据写入journal文件;当mongdb非正常down机,重启mongdb后可根据journal数据来还原写操作;(journal在64位机器上默认是开启 32位需要手动命令开启)

        writeConcern:2

                        暂时还没弄明白(弄明白了在补充记录吧)


???        总结:写关注 主要是在于对于数据的安全和性能之间的权衡; writeConcern有4个级别    -1 不捕捉任何Error   0 捕捉netWorkError   1:捕捉writeError  1&j:true 捕捉写异常并且写入journal防止数据丢失   2:暂时未知;???


 

5,参数-ordered

            ordered:true的时候  我们插入数组文档的时候  如果中间某一个文档元素写入出错那么后面的所有文档元素都不执行写入操作,直接把后面的所有文档元素返回;


MongDB_插入详解

标签:

原文地址:http://my.oschina.net/ZGang/blog/493912

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!