1. 批量插入:
以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销。就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封装消息头数据。对于数据导入而言,我们可以使用mongoimport完成。
2. 数据库清除:
> db.users.remove()
> db.one_collection.drop()
如果在执行数据更新时,有多条文档匹配更新条件,为了避免更新后的_id出现重复性冲突,MongoDB将仅更新第一条查询结果,如:
> post1 = { "name": "stephen", "age" : "35"} { "name" : "stephen", "age" : "35" } > post2 = { "name": "stephen", "age" : 36} { "name" : "stephen", "age" : 36 } > db.blog.insert(post1) > db.blog.insert(post2) > post3 = { "name" : "stephen", "age": 37} { "name" : "stephen", "age" : 37 } > db.blog.update({"name":"stephen"},post3) > db.blog.find() { "_id" : ObjectId("4fcd7e2e20668578cc1097d8"), "name" : "stephen", "age" : 36 } { "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 37 }
使用修改器进行数据更新是原子的,也是高效的,不同于全部文档更新的是被更新文档的_id不会变化,而文档完全更新则会修改文档的_id,以及相关的索引。
> db.blog.find() { "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 41 } { "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 38 } --$inc修改符将匹配条件的文档的age键原子加一,缺省情况下只是更新第一条符合条件的文档。 > db.blog.update({"name":"stephen"},{"$inc":{"age":1}}) > db.blog.find() { "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 42 } { "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 38 } --可以通过update函数的最后一个参数来指定更新所有符合条件的文档,如: > db.blog.update({"name":"stephen"},{"$inc":{"age":1}},true,true) > db.blog.find() { "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 43 } { "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 39 }--$set修改符直接修改匹配文档的内容,如果修改的键存在则直接修改,否则新增。 > db.blog.update({"name":"stephen"},{"$set":{"genda":"male"}}) > db.blog.find() { "_id" : ObjectId("4fcd88b720668578cc1097da"), "age" : "35", "genda" : "male", "name" : "stephen" } --$unset修改符合$set的功能是完全相反的,如: > db.blog.update({"name":"stephen"},{"$unset":{"genda":"male"}}) > db.blog.find() { "_id" : ObjectId("4fcd88b720668578cc1097da"), "age" : "35", "name" : "stephen" } --可以通过$set修改符修改嵌套子文档。 > db.blog.find() { "_id" : ObjectId("4fcd8e0220668578cc1097db"), "title" : "A Blog Post", "author" : { "name" : "joe", "email" : "joe@ee.com" } } > db.blog.update({"title":"A Blog Post"},{"$set":{"author.name":"joe schmoe"}}) > db.blog.find() { "_id" : ObjectId("4fcd8e0220668578cc1097db"), "author" : { "email" : "joe@ee.com", "name" : "joe schmoe" }, "title" : "A Blog Post" }
5. 数组修改器:
> db.blog.insert({"title":"one blog"}) > db.blog.find() { "_id" : ObjectId("4fcd909520668578cc1097dc"), "title" : "one blog" } --如果其操作的键不存在,则创建新的键值,其值的类型为数组类型。 > log.update({"title":"one blog"}, {"$push": {"comments":{"content":"hello"}}}) > db.blog.findOne() { "_id" : ObjectId("4fcd909520668578cc1097dc"), "comments" : [ { "content" : "hello" } ], "title" : "one blog" } --如果$push操作的键值已经存在,且其值为数组类型,该修改符将为该数组添加新的数组元素。 > db.blog.update({"title":"one blog"}, {"$push": {"comments":{"content":"word"}} > db.blog.findOne() { "_id" : ObjectId("4fcd909520668578cc1097dc"), "comments" : [ { "content" : "hello" }, { "content" : "word" } ], "title" : "one blog" } > post = {"username":"joe", "emails":["joe@example.com","joe@gmail.com","joe@yahoo.com"]} { "username" : "joe", "emails" : [ "joe@example.com", "joe@gmail.com", "joe@yahoo.com" ] } > db.blog.insert(post) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "username" : "joe", "emails" : [ "joe@example.com", "joe@gmail.com", "joe@yahoo.com" ] } --$addToSet适用于数组,如果数组中该元素已经存在,该命令就不做任何操作后返回,否则将新元素插入数组。 > db.blog.update({"username":"joe"}, {"$addToSet": {"emails":"joe@gmail.com"}}) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "username" : "joe", "emails" : [ "joe@example.com", "joe@gmail.com", "joe@yahoo.com" ] } > db.blog.update({"username":"joe"}, {"$addToSet": {"emails":"joe@hotmail.com"} > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "emails" : [ "joe@example.com", "joe@gmail.com", "joe@yahoo.com", "joe@hotmail.com" ], "username" : "joe" } --$addToSet和$each的组合可以将数组插入到另外一个数组中。 > db.blog.update({"username":"joe"},{"$addToSet": {"emails":{"$each":["joe@php.net","joe@example.com"]}}}) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "emails" : [ "joe@example.com", "joe@gmail.com", "joe@yahoo.com", "joe@hotmail.com", "joe@php.net" ], "username" : "joe" } --$pop从数组中删除一个元素,如参数为1,表示从数组的尾部删除一个元素,如果是-1,则从头部删除。 > db.blog.update({"username":"joe"}, {"$pop":{"emails":1}}) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "emails" : [ "joe@example.com", "joe@gmail.com", "joe@yahoo.com", "joe@hotmail.com" ], "username" : "joe" } > db.blog.update({"username":"joe"}, {"$pop":{"emails":-1}}) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "emails" : [ "joe@gmail.com", "joe@yahoo.com", "joe@hotmail.com" ], "username" : "joe" } --$pull修改符则是从数据中删除指定的元素 > db.blog.update({"username":"joe"}, {"$pull":{"emails":"joe@yahoo.com"}}) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "emails" : [ "joe@gmail.com", "joe@hotmail.com" ], "username" : "joe" } --使数组中出现重复的元素,便于后面修改符的功能演示。 > db.blog.update({"username":"joe"}, {"$push": {"emails":"joe@gmail.com"}}) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "emails" : [ "joe@gmail.com", "joe@hotmail.com", "joe@gmail.com" ], "username" : "joe" } --在数组中,第一个元素的下标是0,然后依次增长。下面的示例是将数组中下标为1 --(第二个元素)的元素值修改为新值。 > db.blog.update({"username":"joe"}, {"$set":{"emails.1":"joe@example.com"}}) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "emails" : [ "joe@gmail.com", "joe@example.com", "joe@gmail.com" ], "username" : "joe" } --有的时候,特别是在修改查询结果的时候,我们无法获知结果文档数组下标,MongoDB --提供了$定位符表示查询结果的下标。但是该他只更新第一个匹配元素。 > db.blog.update({"emails":"joe@gmail.com"},{"$set":{"emails.$":"joe@hotmail.com"}}) > db.blog.findOne() { "_id" : ObjectId("4fd2e468b2ac404941134bed"), "emails" : [ "joe@hotmail.com", "joe@example.com", "joe@gmail.com" ], "username" : "joe" }
upsert是一种特殊的更新。要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。
> db.blog.remove() > db.blog.update({"username":"joe"},{"username":"joe","age":30},true) > db.blog.findOne() { "_id" : ObjectId("4fd2faac576cd9c101ac0f3d"), "username" : "joe", "age" : 30 }
> db.blog.remove() > db.blog.update({"count":25},{"$inc":{"count":3}},true) > db.blog.find() { "_id" : ObjectId("4fd2fd59576cd9c101ac0f3e"), "count" : 28 }
> var x = db.blog.findOne() > x.count = 40 40 > db.blog.save(x) > db.blog.findOne() { "_id" : ObjectId("4fd2fde4576cd9c101ac0f3f"), "count" : 40 }
可以通过getLastError命令获取更新多个文档时被更新的文档数量。
> db.blog.remove() > db.blog.insert({"name":"stephen"}) > db.blog.insert({"name":"stephen3"}) > db.blog.insert({"name":"stephen4"}) > db.blog.update({},{"$set":{"name":"liu"}},false,true) --n:3表示修改的数量为3。 > db.runCommand({getLastError:1}) { "updatedExisting" : true, "n" : 3, "connectionId" : 1, "err" : null, "ok" : 1 }
> db.blog.insert({"name":"stephen"}) > db.blog.insert({"name":"stephen2"}) > db.blog.find() { "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" } { "_id" : ObjectId("4fd30cd417f6dccb7c058245"), "name" : "stephen2" } > db.runCommand({"findAndModify":"blog", "query":{"name":"stephen2"},"update":{"$set":{"name":"stephen3"}}}) > db.blog.find() { "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" } { "_id" : ObjectId("4fd30cd417f6dccb7c058245"), "name" : "stephen3" } > runCommand({"findAndModify":"blog", "query":{"name":"stephen3"},"remove":true}) > db.blog.find() { "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }
本文向大家介绍MongoDB教程之查询操作实例,包括了MongoDB教程之查询操作实例的使用技巧和注意事项,需要的朋友参考一下 1. 基本查询: 构造查询数据。 2. 查询条件: MongoDB提供了一组比较操作符:$lt/$lte/$gt/$gte/$ne,依次等价于</<=/>/>=/!=。 3. null数据类型的查询: 4. 正则查询: 5. 数组数据
本文向大家介绍MongoDB入门教程之C#驱动操作实例,包括了MongoDB入门教程之C#驱动操作实例的使用技巧和注意事项,需要的朋友参考一下 作为系列的最后一篇,得要说说C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者, 因为提供了丰富的linq操作,相当方便。 官方驱动:https://github.com/mongodb/mongo-cshar
本文向大家介绍MongoDB系列教程(六):java操作mongodb实例,包括了MongoDB系列教程(六):java操作mongodb实例的使用技巧和注意事项,需要的朋友参考一下 java操作mysql数据库的代码我们已经了如指掌了,增删改查,java对mongodb数据库也是类似的操作,先是数据库连接,再是进行操作。 首先我们进入进入admin数据库,然后建立自己的数据库testMongoD
本文向大家介绍MongoDB入门教程之细说MongoDB数据库的增删查改操作,包括了MongoDB入门教程之细说MongoDB数据库的增删查改操作的使用技巧和注意事项,需要的朋友参考一下 看过上一篇,相信大家都会知道如何开启mongodb了,这篇就细说下其中的增删查改,首先当我们用上一篇同样的方式打开mongodb,突然 傻眼了,擦,竟然开启不了,仔细观察“划线区域“的信息,发现db文
数据操作教程 本章我们来了解一下sp框架的数据操作方法。 一、数据查找 findAll() 用法:findAll($conditions = array(), $sort = null, $fields = '*', $limit = null) 参数: $condition,数组形式,查找纪录的条件。有两种方式: 直接键对值的等于关系的AND条件,如array("cid"=>12, "score
本文向大家介绍MongoDB入门教程之索引操作浅析,包括了MongoDB入门教程之索引操作浅析的使用技巧和注意事项,需要的朋友参考一下 这些天项目改版,时间比较紧,博客也就没跟得上,还望大家见谅。 好,今天分享下mongodb中关于索引的基本操作,我们日常做开发都避免不了要对程序进行性能优化,而程序的操作无非就是CURD,通常我们 又会花费50%的时间在R上面,因为Read操作对用