`

MongoDB-基础-02--数据操作

阅读更多

 

出处:http://www.cnblogs.com/stephen-liu74/archive/2012/08/06/2553737.html

 

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:

    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 }

    save是一个shell函数,可以在文档不存在时插入,存在时更新。upsert也可以完成同样的工作,但是不如save命令方便。

    > var x = db.blog.findOne()

    > x.count = 40

    40

    > db.blog.save(x)

    > db.blog.findOne()

    { "_id" : ObjectId("4fd2fde4576cd9c101ac0f3f"), "count" : 40 }

 

7.  返回已更新文档:

    可以通过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

    }

    findAndModify可以原子性的修改查询结果,也可以原子性的删除查询结果。

    > 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" }

    findAndModify命令中每个键对应的值如下:

    findAndModify: 字符串类型的集合名称。

    query:查询文档,用来检索文档的条件。

    sort: 排序结果的条件。

    update:修改文档,对所找到的文档执行的更新。

    remove:布尔类型,表示是否删除文档。

    new:布尔类型,表示返回的是更新前的文档还是更新后的文档。缺省是更新前文档。

    update和remove必须有一个存在,也只能有一个存在。如果没有匹配的文档,该命令会返回一个错误。这个命令有些限制,即一次只能处理一个文档,也不能执行upsert操作,只能更新已有文档。

分享到:
评论

相关推荐

    mongodb-hadoop-workshop:MongoDB-Hadoop 研讨会练习

    MongoDB 作为操作数据库为应用程序提供支持,而 Hadoop 与强大的分析基础设施一样提供智能。 在本次研讨会中,我们将首先了解这些技术如何与适用于 Hadoop 的 MongoDB 连接器配合使用。 然后我们将介绍使用 ...

    java8看不到源码-mongodb-gremlin:Gremlin遍历机的MongoDB编译器

    创建它是为了为文章提供技术基础。 如果有人有兴趣接管这个项目并清除 MongoDB 剩余的 CRUD 操作(例如删除和更新),请随时这样做。 为了提供快速 POC,引入了一些特性。 这些应该在更彻底的实施中得到纠正,并且...

    MongoDB基础入门到高级进阶

    MongoDB单机部署、副本集部署、分片部署以及相关操作 MongoDB的客户端连接和常用命令操作 SpringDataMongoDB对MongoDB的操作 MongoDB的索引和操作 MongoDB的安全认证 4、主讲内容 基础入门部分 章节一:MongoDB相关...

    MongoDB-Fundamentals:在现代云计算环境中学习实用的MongoDB技能

    从NoSQL的基础开始,您将在动手案例研究的帮助下学习高级数据操作技术和应用程序开发。 您将学到什么 在云上设置和使用MongoDB Atlas 从MongoDB插入,更新,删除和检索数据 建立聚合管道以执行复杂的查询 使用索引...

    mongodb数据库

    mongodb 文档数据库,存储的是文档(Bson->json的二进制化). 特点:内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的js语法来操作. 传统型数据库: 结构化数据, 定好了表结构后,每...

    MongoDB基础了解.docx

    mongodb的学习最好还是结合项目来实际操作一下比如你学习爬虫时下载的那些数据可以引入mongodb数据库中,当然这只是基础篇,你可以先看看了解以下,还是各种增删改查操作。

    Mongodb基础知识详解(值得珍藏).pdf

    首先,掌握MongoDB基础知识可以帮助开发人员更好地理解数据模型。MongoDB使用文档结构来存储数据,这与其他关系型数据库有很大的不同。通过了解文档结构和数据模型,开发人员可以更有效地设计数据库模式和表结构,以...

    MongoDB企业级分片集群搭建视频.zip

    3 MongoDB客户端基础使用.mp4 4 MongoDB集合的多种查询条件.mp4 5 MongoDB索引查询与建立.mp4 6 MongoDB数据库的监控命令.mp4 7 MongoDB副本集的搭建.mp4 8 MongoDB副本集故障自动切换.mp4 9 MongoDB副本集各实例的...

    老生常谈MongoDB数据库基础操作

    为了保存网站的用户数据和业务数据,通常需要一个数据库。MongoDB和Node.js特别般配,因为Mongodb是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改查等管理数据库的命令和...

    完整版 Python高级开发课程 高级教程 07 Python操作MongoDB数据库.pptx

    02 Python数据结构.pptx 03 Python函数和函数式编程.pptx 04 Python面向对象编程.pptx 05 Python数据采集 网络爬虫 网页爬虫.pptx 06 Python操作MySQL数据库.pptx 07 Python操作MongoDB数据库.pptx 08 Python多线程 ...

    深入探究MongoDB:从基础到实战,一个全面的指南

    MongoDB是一个领先的NoSQL数据库,以其灵活的文档型数据模型、简单的安装和高效的操作而闻名。MongoDB的记录是由字段和值对组成的文档,类似于JSON对象,支持不同字段的文档在同一个集合中,以及线上修改数据模式...

    amandakelake#blog#MongoDB基础1

    1、安装 2、找到安装目录 3、建立存储数据的文件夹 4、启动MongoDB 5、基础操作 6、插入 7、正确退出数据库

    NoSQL数据库MongoDB基础学习

    本文从基本概念,数据逻辑结构、存储结构,功能特性,系统架构,应用场景等方面详细的介绍了MongoDB,并将MongoDB与MySQL操作命令对比,并附加了MongoDB爱好者交流QQ群

    【MongoDB】数据库的基本操作01

    目录 1.1基础入门 1.1.1应用场景 1.1.2环境搭建 1.1.3MySQL和MongoDB ... Mongodb是一个内存数据库,数据都存放再内存中 非关系型数据库是一种文档型的数据库,即可以存放xml、json、bson类型的数据,数据结

    webapi + mongodb 基础实例 代码简单易懂 直接运行

    webapi + mongodb 实现基础操作(数据的增删查改) 简单实例 代码易懂 直接运行 希望对新人有所帮助

    每天30分钟 一起来学习爬虫——day13(数据存储 之 MongoDB基础操作)

    文章目录什么是MongoDB安装MongoDB对MongoDB的操作1.基本指令数据库的CEUD操作1.增加数据2、查询数据3.修改数据4、删除数据 什么是MongoDB MongoDB是一种面向文档的数据库管理系统,在开始今天的学习之前,先来看看...

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    2.6.2 使用Shell对MongoDB的基本操作 2.6.3 使用Shell的诀窍 2.6.4 特殊的集合名 2.7 本章小结 第3章 文档的增加、修改及删除 3.1 插入并保存文档 3.1.1 插入的原理和作用 3.1.2 批量插入 3.2 ...

    毕业设计-基于用户画像的电影推荐系统设计与实现,以Django作为基础框架,采用MTV模式,数据库使用MongoDB、MySQL

    本系统是以Django作为基础框架,采用MTV模式,数据库使用MongoDB、MySQL和Redis,以从豆瓣平台爬取的电影数据作为基础数据源,主要基于用户的基本信息和使用操作记录等行为信息来开发用户标签,并使用Hadoop、Spark...

    MongoDB基础命令以及操作示例详解

    Mongodb是一个非关系型数据库软件(NoSql),以类似json的形式bson存储数据,bson有二进制的json的意思,官方说bson的效率更高,很适合存储类似于对象的数据,这里权当把自己学习的过程记录下来。 关于MongoDB的安装方法给...

    springMongodb参考文档中文版

    自定义基础存储库 7.7。从聚合根发布事件 7.8。Spring数据扩展 7.8.1。Querydsl扩展 7.8.2。Web支持 7.8.3。存储库填充程序 7.8.4。传统网络支持 参考文档 8.介绍 8.1。文档结构 9. MongoDB支持 9.1。入门 9.2。示例...

Global site tag (gtag.js) - Google Analytics