`

征服 Mongodb 之 Modifier初识

阅读更多

本以为Mongodb的CRUD就是些常规操作,其实不然,针对字段、数组的操作还有很多特定指令——修改器。实在是不知道该如何对这一对$符号开始的指令给个靠谱的名称。 

 

 

集群配置相关链接:

征服 Mongodb 之 安装与系统服务配置

征服 Mongodb 之 主从复制&集群复制

 

基本操作相关链接:

征服 Mongodb 之 常用命令、基本数据类型  

征服 Mongodb 之 Modifier初识

征服 Mongodb 之 Modifier增强

征服 Mongodb 之 CRUD

 

   在Mongodb中,有很多被称为Modifier的特殊标识符。通过这些Modifier,可以增加查询条件限定,对数据进行特定变更,实现像常规数据库的的特定条件更新与查询。

   这里会介绍$inc、$set、$unset、$push、$pull、$ne$addToSet、$each的相关实现,主要用于更新操作。详见:http://cn.docs.mongodb.org/manual/reference/operator/

    一、字段操作——$inc、$set、$unset

 

    接下来的内容主要是针对Update操作的各种补充。微笑

    $inc、$set、$unset 都是针对字段的操作

 

  • $inc

    即,Increase,就是递增(递减)。

    我们先看这条数据:

 

> db.user.find()
{ "_id" : ObjectId("50fe4f627252799620eee0db"), "_class" : "org.zlex.mongodb.domain.User", "uid" : "u1234567890", "address" : "上海", "age" : 1 }

   对age做递增:

> db.user.update({"uid" : "u1234567890"},{"$inc":{"age":1}})
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 2, "uid" : "u1234567890" } 

   对age做递减:

> db.user.update({"uid" : "u1234567890"},{"$inc":{"age":-1}})
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 1, "uid" : "u1234567890" }

    备注:$inc只能用于数字增减操作

 

  • $set & $unset

    与$inc相比,$set就是一个完全覆盖的指令,$unset是删除某个字段。

    参考上例,把年龄直接置为30:

> db.user.update({"uid" : "u1234567890"},{"$set":{"age":30}})
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "uid" : "u1234567890" }

    干掉age这个字段:

> db.user.update({"uid" : "u1234567890"},{"$unset":{"age":1}})
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "uid" : "u1234567890" }

    至于age这后面跟着是个什么值无挂紧要了。不过这名字起的($set & $unset),实在是让人有点迷惑。天真

 

   二、数组操作—$push、$pull、$addToSet

  • $push & $pull 

     这两个指令用于数组操作,追加元素 & 删除元素。

     向上述数据中追加comments数组:

 

> db.user.update({"uid" : "u1234567890"},{ $push : {"comments" : {"name":"zlex"}}})
> db.user.update({"uid" : "u1234567890"},{ $push : {"comments" : {"email":"zlex@snowolf.org","birthday":new Date()} } })
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "comments" : [   {       "name" : "zlex" },      {       "email" : "zlex@snowolf.org",   "birthday" : ISODate("2013-02-06T02:12:27.869Z") } ], "uid" : "u1234567890" }

    上述数据中,comments数组中有两个元素{ "name" : "zlex" } 和 { "email" : "zlex@snowolf.org", "birthday" : ISODate("2013-02-06T02:12:27.869Z") }

 

  我们可以通过$pull,删除某一个元素:

 

> db.user.update({"uid" : "u1234567890"},{ $pull : {"comments" : {"name":"zlex"}}})
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "comments" : [   {       "email" : "zlex@snowolf.org",   "birthday" : ISODate("2013-02-06T02:12:27.869Z") } ], "uid" : "u1234567890" }

 通过{ $pull : {"comments" : {"name":"zlex"}}}定位到数组的具体元素。当然也可以根据数组元素的部分信息进行定位删除元素:

 

 

> db.user.update({"uid" : "u1234567890"},{ $pull : {"comments" : {"email":"zlex@snowolf.org"}}})
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "comments" : [ ], "uid" : "u1234567890" }

    不得不说,mongodb的自带查询功能很强大!吐舌头

 

 

  • $ne & $addToSet 

   $ne——not exist,即当所属条件不存在时,查询时也会用到

   $addToSet——add to set,即避免重复的追加

   会有这样一种情况,当一个值不在数组中时将其插入,这就需要用到$ne和$push。

 

> db.user.update({"uid" : "u1234567890"},{ $push : {"comments" : {"email":"zlex@snowolf.org","birthday":new Date()} } })
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "comments" : [   {       "email" : "zlex@snowolf.org",   "birthday" : ISODate("2013-02-06T03:06:00.866Z") },     {       "email" : "zlex@snowolf.org",       "birthday" : ISODate("2013-02-06T03:06:15.675Z") } ], "uid" : "u1234567890" }

   如上述操作,造成了重复数据,可通过$ne指令避免:

 

 

> db.user.update({"uid" : {"$ne" :"u1234567890"}},{ $push : {"comments" : {"email":"zlex@snowolf.org","birthday":new Date()} } })
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "comments" : [   {       "email" : "zlex@snowolf.org",   "birthday" : ISODate("2013-02-06T03:06:00.866Z") } ], "uid" : "u1234567890" }

   其实就是忽略了符合{"uid" : "u1234567890"}条件的数据更新。

 

 

    使用$addToSet可以避免添加重复数据。

    先通过$push向数组追加一组数据:

 

> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "uid" : "u1234567890" }
> db.user.update({"uid" : "u1234567890"},{ $push :{"email":"zlex@snowolf.org"} })
> db.user.update({"uid" : "u1234567890"},{ $push :{"email":"snowolf@snowolf.org"} })
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "email" : [ "zlex@snowolf.org", "snowolf@snowolf.org" ], "uid" : "u1234567890" }

    这时,向email数组中追加一条已存在的数据分别用$push$addToSet操作.

 

    $push :

> db.user.update({"uid" : "u1234567890"},{ $push :{"email":"snowolf@snowolf.org"} })
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "email" : [ "zlex@snowolf.org", "snowolf@snowolf.org", "snowolf@snowolf.org" ], "uid" : "u1234567890" }

    这时数据有重复("email" : [ "zlex@snowolf.org", "snowolf@snowolf.org", "snowolf@snowolf.org" ])。

    

    $addToSet :

> db.user.update({"uid" : "u1234567890"},{ $addToSet :{"email":"zlex@snowolf.org" } })
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "email" : [ "zlex@snowolf.org", "snowolf@snowolf.org", "snowolf@snowolf.org" ], "uid" : "u1234567890" }

    数据未重复。

    如果想要一次插入多条数据,且数据不重复,可以用$addToSet & $each联合操作。

    先清理email字段,并置一个默认值:

> db.user.update({"uid" : "u1234567890"},{ $unset :{"email":"zlex@snowolf.org" } })
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "uid" : "u1234567890" }
> db.user.update({"uid" : "u1234567890"},{ $addToSet :{"email":{"$each":["snowolf@sina.com"] } }})
> db.user.find()
{ "_class" : "org.zlex.mongodb.domain.User", "_id" : ObjectId("50fe4f627252799620eee0db"), "address" : "上海", "age" : 30, "email" : [ "snowolf@sina.com" ], "uid" : "u1234567890" } 

    接着用$addToSet & $each联合操作批量插入数据:

> db.user.update({"uid" : "u1234567890"},{ $addToSet :{"email":{"$each":["snowolf@sina.com","snowolf@sohu.com","snowolf@yahoo.com","snowolf@baidu.com"] }}})
> db.user.findOne({"uid" : "u1234567890" })
{
        "_class" : "org.zlex.mongodb.domain.User",
        "_id" : ObjectId("50fe4f627252799620eee0db"),
        "address" : "上海",
        "age" : 30,
        "email" : [
                "snowolf@sina.com",
                "snowolf@sohu.com",
                "snowolf@yahoo.com",
                "snowolf@baidu.com"
        ],
        "uid" : "u1234567890"
}

    数据不重复,OK!

    暂时到此为止,本来想再深入些,但《MongoDB权威指南》的例子实在是有些缺失凌乱,给我造成理解误区。为避免继续混乱下去,我打算先继续后面的研究。犹豫

 

集群配置相关链接:

征服 Mongodb 之 安装与系统服务配置

征服 Mongodb 之 主从复制&集群复制

 

基本操作相关链接:

征服 Mongodb 之 常用命令、基本数据类型  

征服 Mongodb 之 Modifier初识

征服 Mongodb 之 Modifier增强

征服 Mongodb 之 CRUD

1
2
分享到:
评论

相关推荐

    Educoder的实训项目MongoDB代码.TXT

    Educoder实训项目MongoDB类项目的全部代码,项目发布人是国防科技大学的,亲测一个个通过

    征服 Mongodb 之 Spring相关实现(一)

    在“征服MongoDB之Spring相关实现(一)”这篇博文中,作者可能还会深入讨论如何使用Spring Data MongoDB的特性,例如自定义查询、事务管理、索引创建等。同时,可能还会涉及一些最佳实践和常见问题的解决方案。通过...

    MongoDB之conf配置文件详解

    MongoDB之conf配置文件详解 MongoDB的配置文件是服务器的核心组件之一,它控制着MongoDB服务器的各种设置和行为。在本文中,我们将详细介绍MongoDB的配置文件的各个部分,并解释每个设置的作用和意义。 一、数据库...

    JAVA操作MongoDB之spring整合

    总结来说,"JAVA操作MongoDB之spring整合"涉及到的主要知识点包括:Spring Boot项目结构,MongoDB的配置和连接,Spring Data MongoDB的MongoRepository接口,以及如何在Controller层处理HTTP请求。通过这样的整合,...

    MongoDB初识

    MongoDB入门资料,其中包括简介,语法,关键字等等。它是一种文档导向数据库管理系统,是基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。 其旨在为web应用提供可扩展...

    linux安装mongodb教程

    /usr/local/mongodb/mongodb-linux-2.0.7/bin/mongod --dbpath=/usr/local/mongodb/data/db --logpath=/usr/local/mongodb/mongodb-linux-2.0.7/logs/mongodb.log --logappend --port=27017 --fork 知识点 6:配置...

    课时8:MongoDB数据库安全机制.mp4

    MongoDB数据库

    mongodb-测试数据

    MongoDB是一种流行的开源、分布式文档数据库,常被用于构建高性能、可扩展的应用程序。这个“mongodb-测试数据”压缩包显然包含了一些用于测试MongoDB功能的样例数据集,特别是针对增、删、改、查(CRUD)操作的学习...

    MongoDB实验 - .docx

    MongoDB 实验报告 本实验报告旨在详细介绍 MongoDB 的安装、配置和基本操作步骤,本报告基于 CentOS 7 系统,通过一步一步的截图和文字说明,帮助读者快速掌握 MongoDB 的使用。 一、安装 MongoDB 首先,我们需要...

    Linux安装mongodb客户端

    sudo vim /etc/yum.repos.d/mongodb-org-4.2.repo 写入: [mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpg...

    MongoDB图形化管理工具 MongoDB Compass

    MongoDB图形化管理工具 MongoDB Compass

    mongodb Windows7 64位

    MongoDB是一款开源、高性能、无模式的文档型数据库,它在现代应用程序开发中扮演着重要的角色,特别是在处理大量非结构化数据时。针对"mongodb Windows7 64位"这个主题,我们将深入探讨MongoDB在Windows 7 64位操作...

    mongodb c#驱动最新驱动mongodb.driver.dll 版本2.12.0-beta1

    MongoDB 是一个流行的开源、基于分布式文件存储的数据库系统,主要设计用于处理大量数据的分布式环境。C# 驱动是 MongoDB 提供的一种客户端库,允许 .NET 开发者与 MongoDB 数据库进行交互。标题提到的是 MongoDB 的...

    如何安装MongoDB 如何使用MongoDB

    本课程是一套关于MongoDB应用开发的实战性教程,名为《深入浅出...学员从中可领会到MongoDB设计的精妙之处,体会到MongoDB强大的类sql查询语言,感受到MongoDB与其它Nosql数据库的异同之处。(教程下载地址在文本里面)

    MongoDB入门指南.pdf

    MongoDB入门指南 MongoDB是一种开源的文档类型数据库,它具有高性能、可扩展、高可用、自动收缩等特性。MongoDB能够避免传统的ORM映射,从而有助于开发。MongoDB中的每一行记录就是一个文档,它是一个由键值对构成...

    spring-data使用mongodbTemplate对MongoDB进行读写操作

    Spring Data MongoDB是一个强大的Java库,它为开发人员提供了一种简单的方式来访问和操作MongoDB数据库。这个库是Spring Data框架的一部分,旨在简化数据访问层的实现,尤其在使用NoSQL数据库如MongoDB时。MongoDB...

    mongodb.dll 下载.zip

    MongoDB是一个开源、分布式、高性能的NoSQL数据库,以其灵活性、可扩展性和高可用性而闻名。`mongodb.dll`是MongoDB数据库系统在Windows平台上运行所必需的一个动态链接库(DLL)文件,它包含了MongoDB客户端和...

    Centos7下安装MongoDB

    安装MongoDB需要安装mongodb-org元数据包,该包包含四个组件包:mongodb-org-server、mongodb-org-mongos、mongodb-org-shell、mongodb-org-tools。 在Centos7下安装MongoDB可以通过epel-release的yum源来安装,...

    mongodb数据库jar包

    MongoDB是一个流行的开源、分布式文档型数据库,设计用于处理大量数据并提供高可用性和高性能。在Java应用程序中,为了与MongoDB进行交互,我们需要使用Java MongoDB驱动程序。这个压缩包包含的就是Java连接MongoDB...

    辛星笔记之MongoDB教程

    NoSQL数据库虽然有诸多优点,但也存在一些不足之处。比如,它不提供对SQL的支持,意味着不能使用标准的SQL语言进行查询和管理。此外,其支持的特性可能不如传统关系型数据库丰富,并且一些产品由于开发时间较短,...

Global site tag (gtag.js) - Google Analytics