`

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-linux-x86_64-2.2.6.tgz

    一、MongoDB基础知识 MongoDB以JSON(JavaScript Object Notation)格式存储数据,这种格式灵活且易于理解和处理。数据以文档的形式存储,每个文档都是一组键值对,类似于JavaScript的对象。MongoDB支持丰富的查询...

    mongodb-linux-x86_64-rhel70-3.6.4.tgz

    总之,"mongodb-linux-x86_64-rhel70-3.6.4.tgz"提供了在RHEL 7.0上运行MongoDB的强大基础,结合其3.6版本的特性,可以为企业级应用提供高效、安全且可扩展的数据存储解决方案。正确安装和配置MongoDB,充分利用其...

    mongodb-linux-x86_64-rhel62-v3.4-latest.tgz

    7. **权限控制**:MongoDB支持角色基础的访问控制(RBAC),可以通过创建用户角色来限制用户的操作权限,保障数据库的安全。 请注意,MongoDB 3.4已经不再维护,对于生产环境,建议使用更稳定和安全的最新长期支持...

    mongodb-linux-x86_64-rhel62-4.2.5.tgz

    此外,角色基础的权限控制允许管理员精细管理用户权限,确保数据安全。 除此之外,4.2版本引入了Change Streams功能,这是一个实时数据变更的API。开发者可以订阅集合、数据库或整个MongoDB实例的变更事件,实时...

    mongodb-linux-s390x-rhel72-4.2.0.tgz

    MongoDB在RHEL上运行可以受益于其成熟的系统管理和安全特性,为生产环境提供稳定的运行基础。 - RHEL 7.2是该系列的一个版本,它支持更新的技术如KVM虚拟化和OpenSSL 1.0.2,同时也包括对Docker等容器技术的支持,...

    mongodb-windows-x86_64-5.0.6-signed.zip

    1. **文档型数据模型**:MongoDB使用JSON-like的BSON格式存储数据,这种格式易于理解和操作,适合结构化和半结构化的数据。 2. **分布式架构**:MongoDB支持分片(Sharding)和复制集(Replica Sets),可以水平...

    mongodb-linux-x86_64-ubuntu1604-4.0.0

    MongoDB是一款开源、分布式、高性能的NoSQL数据库,特别适合处理海量数据和高并发场景。在本场景中,我们关注的是适用于Ubuntu 16.04操作系统的MongoDB 4.0版本安装包。MongoDB 4.0是MongoDB的一个重要里程碑,引入...

    mongoDB-CURD操作-----JAVA

    MongoDB是一种流行的开源、分布式文档数据库,常用于处理大规模数据。在Java开发中,与MongoDB的交互通常通过Java驱动程序实现,它提供了对数据库的基本CURD(创建、读取、更新、删除)操作的支持。本篇文章将深入...

    mongodb-linux-x86_64-3.4.6

    5. **操作工具**:MongoDB提供了强大的命令行工具,如`mongod`(数据库进程)、`mongoshell`(交互式JavaScript接口)等。在3.4.6版本中,这些工具进行了优化,使得日常管理和维护更加便捷。 6. **监控和诊断**:...

    mongodb-linux-x86_64-rhel70-3.6.3.tgz

    5. **读写分离与分片**:MongoDB的分片功能允许在多台机器上分散数据,提高读写性能,3.6版本在此基础上进一步优化了分片策略。 6. **新的备份工具**:推出了Mongodump和Mongorestore的新版本,提供了更快、更可靠...

    mongodb-osx-ssl-x86_64-4.0.9.tgz

    3. ODM 功能:通过 Mongoose,你可以创建复杂的模型定义,将数据库中的集合映射为 JavaScript 对象,简化数据操作。 4. 自动验证:在插入或更新数据时,Mongoose 可以根据模型定义自动进行数据验证,防止不合规的...

    mongodb-windows-x86_64-4.4.0-signed

    标题中的"mongodb-windows-x86_64-4.4.0-signed"表明这是MongoDB针对Windows 64位操作系统的一个特定版本,4.4.0是其版本号,"signed"意味着这个安装文件已经过数字签名,确保了软件的安全性和完整性。 描述中提到...

    Java连接mongoDB需要的jar包(3.9.1)

    开发者可以使用这个库来创建MongoClient实例,建立到MongoDB服务器的连接,然后执行各种数据库操作,如读取、插入、更新和删除数据。 3. `mongodb-driver-core-3.9.1.jar`: 这个核心库包含了基本的网络通信和线程...

    mongodb-linux-x86_64-v3.6-latest.tgz

    9. **安全性**:MongoDB 3.6引入了X509认证、角色基础的访问控制(RBAC)和加密功能,增强了数据的安全性和合规性。 10. **性能优化**:MongoDB支持索引、聚合框架和查询优化器,能有效提高查询速度。此外,其内置...

    mongodb-java驱动,内含3个jar包和一个JAVA测试类

    在实际开发中,可以使用MongoDB Java驱动构建复杂的查询、聚合操作和数据处理逻辑,配合Spring Data MongoDB等高级框架,可以进一步简化开发工作,提高效率。对于分布式应用,驱动还支持分片、复制集等高级特性,...

    mongodb-linux-x86_64-suse11-3.0.4 (1)

    MongoDB 是一个高性能、开源、无...通过利用其分布式特性,企业可以构建可扩展的云基础设施,并保证数据的安全性和可靠性。在SUSE Linux Enterprise Server 11环境下,这个版本的MongoDB为开发和部署提供了稳定的平台。

    mongodb-cxx-driver-r3.6.2使用vs2017编译的项目和测试代码

    首先,`mongo-c-driver-1.17.3.tar.gz`是一个C语言的MongoDB驱动程序,它是C++驱动的基础,提供了基础的网络通信和认证功能。解压后,`mongo-c-driver-1.17.3`目录包含源码和编译所需文件,开发者可以使用CMake来...

    spring-data-mongodb-1.2.0.RELEASE

    Spring Data MongoDB 是 Spring 框架下的一个模块,专为利用 MongoDB 数据库设计,它提供了丰富的抽象层,使得开发者能够以简洁、直观的方式进行数据操作。本文将深入探讨 Spring Data MongoDB 1.2.0.RELEASE 版本中...

    odbc-mongodb-1_0_14-windows

    在详细解释这个软件包之前,我们先来理解ODBC和MongoDB的基础知识: 1. **ODBC**:ODBC是应用程序和数据库之间的桥梁,通过ODBC驱动程序,应用程序可以与任何支持ODBC的数据库进行交互,而无需关心数据库的具体实现...

    mongodb-基础知识和高级知识

    1. 聚合框架:MongoDB的聚合框架允许开发者进行复杂的数据分析,包括管道操作符、聚合阶段等,可用于统计分析、数据转换等任务。 2. MapReduce:MongoDB提供了MapReduce功能,用于执行分布式计算,处理大规模数据的...

Global site tag (gtag.js) - Google Analytics