10天掌握MongoDB 第二天:初识增删改
sunzhe336
贡献于2012-02-16
530
2
0
10天掌握MongoDB 第二天:初识增删改
下载需要
5
金币
[ 金币充值 ]
服务器/托管费、人工审核、技术维护等都需要很多费用,请您支持深度开源的发展
下载PPT
标签:
NoSQL数据库
教学
C#
Java
JavaScript
PPT 内容
1. ——网鸟老兵系列课程之10天掌握MongoDB第二天:初识增删改网鸟出击,必属精品! 微博:http://t.qq.com/ymindo QQ:120468681(ymind chan) Q群:47700865(刺客巅峰)陈颜铭出品
2. 添加文档删除文档更新文档其他教学内容
3. 插入时MongoDB会检查文档是否包含_id,如果文档没有指定_id,MongoDB会为其创建; 对于多个文档,我们推荐批量操作,批量操作有如下优点: 更少的连接次数; 更少的信息头检测; 对“待插入集合”的灵活控制; 默认情况下,插入文档时MongoDB仅检查传入数据是否包含_id以及数据大小是否超过4MB(v1.8+为16M),除此之外不再做任何验证; 如此简单的判断可以得到更高的性能; 缺点是可能被录入无效数据; MongoDB在插入数据是不执行任何代码,因此没有注入攻击的风险;添加文档db.foo.insert({ "bar" : "baz“ });
4. 建议:如果要清空集合,而且集合内包含了过多记录时,不妨考虑使用db.drop_collection(‘foo’)命令直接删除集合,然后使用db.foo. ensureIndex()命令重建索引(之前的索引已经被drop掉了)。删除文档// 删除全部文档(清空集合) db.foo.remove(); // 删除指定记录 db.foo.remove({ "bar" : "baz“ });
5. // 原文档 { "_id" : ObjectId("4b2b9f67a1f631733d917a7a"), "name" : "joe", "friends" : 32, "enemies" : 2 } // 期望结果 { "_id" : ObjectId("4b2b9f67a1f631733d917a7a"), "username" : "joe", "relationships" : { "friends" : 32, "enemies" : 2 } }更新文档——文档替换(1)
6. // 操作:首先查找记录 var joe = db.users.findOne({"name" : "joe"}); // 修改记录属性,很普通的JavaScript语法 joe.relationships = {"friends" : joe.friends, "enemies" : joe.enemies}; joe.username = joe.name; delete joe.friends; delete joe.enemies; delete joe.name; // 更新 db.users.update({ "name" : "joe" }, joe);更新文档——文档替换(2)老陈:update操作会替换整个匹配到的文档,使用时请千万留意! update有2个可选的bool参数,第1个表示是否开启upsert模式(文档存在时更新,不存在时自动创建);第2个表示是否开启多multi模式(默认情况下update操作只会更新第一个匹配到的文档,如果开启multi模式,则会更新所有匹配到的文档)。
7. // 更新:指定第三个参数为true可以开启upsert模式 db.users.update({ "name" : "joe" }, joe, true);更新文档——upsert模式在upsert模式下,如果找到匹配的记录则更新之,否则如果找不到匹配记录就会创建一条新的记录。 老陈:对于upsert模式要慎用!如果对不完整的文档开启upsert,那么当记录不存在时,自动创建的也是不完整的记录。有点儿绕口,慢慢体会吧!
8. // 更新:指定第四个参数为true可以开启multi模式 db.users.update({ "name" : "joe" }, joe, true, true);更新文档——Multi模式默认情况下update只会更新第一个匹配到的文档,开启multi模式,才会更新所有匹配到的文档。 老陈再次提醒大家:MongoDB的update操作是替换整个文档的,而不是对文档做出局部修改。如果要单独修改一个或多个键或值,请使用修改器。
9. 修改器说明备注$inc增加或减少数字的值,键不存在时会自动创建数字$set设置指定键的值,键不存在时会自动创建$unset$set的反操作,会删除键及键值$push将元素追加到数组末尾,数组不存在会自动创建数组$pushAll$push的批量操作版本数组$addToSet同$pushAll,但会自动过滤重复元素数组$pop{$pop : {key : 1}}——从数组末尾移除元素 {$pop : {key : -1}}——从数组开头移除原色数组$pull从数组中移除所有匹配的元素数组$pullAll$pull的批量操作版本数组$rename修改指定键的键名键$bit对整形键值执行位操作“与”、“或”等数字更新文档——修改器
10. JavaScriptfoo[3].hits = 5;MongoDB{ ‘$set’: { foo.3.hits = 5 } };定位操作符(”$”)——神马是定位?将数组foo中下标为3的元素的hits值设置为5 上图演示了JavaScript和MongoDB的不同实现方法
11. 定位操作符(”$”)——未知?上一节中,注意标黄的数字3了吗?对,就是它!3在两种语法中都表示数组下标。通过$set等修改器,我们可以对数组中的任意元素进行操作,然而问题在于,我们不知道某个元素的下标时该怎么办?? 不要慌,钱来啦!呃,不是,是”$”来啦!它用来定位查询文档已经匹配的元素,使用方法则很简单,就是替换上图MongoDB语法中的3即可。// $inc操作 db.blog.update( {"post" : post_id}, {"$inc" : {"comments.$.votes" : 1} } ); // $set操作 db.blog.update( {"comments.author" : "John"}, {"$set" : {"comments.$.author" : "Jim"} } ); /* 注意:定位符只会更新第1个匹配到的元素!!! */
12. update仅更新文档允许upsert允许multifindAndModify更新文档并返回结果不允许multi执行速度较慢可以执行删除操作findAndModify——有神马不同?从字面意思上理解findAndModify与update似乎很雷同,但其实不然,它们之间有着很大的差别。
13. findAndModify——返回已更新的文档关于findAndModify这里不做实例了,老陈翻译了一下它的几个参数的说明(这里以MongoDB官方网站为准,书中的内容已经过时):参数说明默认值query查询条件,用来确定匹配的项{}sort如果匹配到多个文档,这里可以指定排序方式{}remove表示是否删除匹配到的文档N/Aupdate更新操作。N/Anew如果设置为true,将返回更新后的文档。 注意,此参数在remove为true时无效。falsefields请参考http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields All fieldsupsert如果设置为true,则在匹配项不存在时就自定创建 《MongoDB 权威指南》中的内容已经过时false
14. findAndModify——实现自增标识在第一集中我们提到MongoDB没有内置的自增标识支持,怎么办呢?MongoDB官方提供了一个办法,使用findAndModify来实现自增标识,再加上findAndModify本身的操作是原子性的,不存在并发问题,因此很安全。下面是shell中的实现:// 以下操作为users集合返回一个新的自增标识的值 db.foo.findAndModify( { ‘query’: {"_id": "users"}, // 标识增量为 1 ‘update’: { $inc: { "seq": 1 } }, // 返回修改后的值 ‘new’: true }); 参考地址:http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-SequenceNumbers
15. 瞬时完成无需等待执行结果操作完成后不会再向客户端反馈结果优点:速度快缺点:无法保证数据完整性安全操作安全操作会等待服务器的操作执行完毕并判断有无异常发生优点:可以保证数据完整性缺点:速度慢请求和连接MongoDB内部维护一个连接队列,保证每个连接永远只有1个对应的客户端在同一个连接内不会产生并发问题缺点:多个连接之间存在并发问题一些C#、Ruby、Python、Java等驱动库内置了连接池机制,应当注意由此带来的并发问题!其他
16. 本集PPT中我们主要阐述了MongoDB的增删改操作,对于查询操作尽是只言片语,不要着急,下一集PPT是专门来讲这个find操作的。 对本系列PPT有任何疑问请通过微博向我反馈,也可以进入网鸟NoSQL超级QQ群讨论。 微博地址:http://t.qq.com/ymindo NoSQL群:23152359结束语
PPT 图集
相关PPT
10天掌握MongoDB 第二天:初识增删改
10天掌握MongoDB 第一天:认识MongoDB
10天掌握MongoDB 第四天:使用索引
10天掌握MongoDB第六天:进阶指南
10天掌握MongoDB第七天:服务器管理
10天掌握MongoDB第九天:MongoDB分片
10天掌握MongoDB第十天:分享实战经验
10天掌握MongoDB 第三天:学会find
10天掌握MongoDB第八天:MongoDB复制
10天掌握MongoDB 第五天:聚合操作