MongoDB教程之数据操作实例


本文整理自网络,侵删。

1.  批量插入:

     以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销。就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封装消息头数据。对于数据导入而言,我们可以使用mongoimport完成。
 
2.  数据库清除:

代码如下:

    > db.users.remove()
 
    以上命令将会清除users集合中的所有数据,但是不会删除集合本身以及关联的索引。数据删除操作是不可恢复的,一旦删除就物理的删除了。对于全集合清除这种case,一个更为有效的方式是直接删除集合对象本身以及他关联的所有索引,之后再依次重建,如:
 
代码如下:

    > db.one_collection.drop()
 
 
3.  数据更新: 

    如果在执行数据更新时,有多条文档匹配更新条件,为了避免更新后的_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 }
 
 
4.  修改器:

    使用修改器进行数据更新是原子的,也是高效的,不同于全部文档更新的是被更新文档的_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"
   }
 
6.  upsert:

阅读剩余部分

相关阅读 >>

mongodb快速入门笔记(六)之mongodb的文档修改操作

mongodb中对文档的增删查改基本操作方法总结

分布式文档存储数据库之mongodb访问控制的操作方法

详解mongodb中的日志模块

mongodb driver使用代码详解

mongodb导入json数据的方法

mongodb入门教程之常用的运维技术介绍

对标mongodb存储类json数据文档统计分析详解

mongodb集合中的文档管理

如何备份,还原和迁移mongodb数据库

更多相关阅读请进入《mongodb》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...