热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库创建,更新,删除文档等操作

创建文档向MongoDB插入数据,使用insert,如:db.refactor.insert({refactorsblog:http://www.cnblogs.com/refactor})这个操作会给文档增加一个_id,键,并保存在数据库中。批量插入如果要插入多个文档,使用批量插入会快一些,批量化插入能传

创建文档

向MongoDB插入数据,使用insert,

如:db.refactor.insert({"refactor's blog":"http://www.cnblogs.com/refactor"})

这个操作会给 文档 增加 一个"_id",键,并保存在数据库中。

批量插入

如果要插入多个文档,使用批量插入会快一些,批量化插入能传入一个有文档构成的数据给数据库

一次批量插入只是单个的TCP请求,避免了许多零碎的请求带来的开销.由于无需处理大量的消息头,

这样能减少插入时间.每当单个文档发送致数据库时,会有一个头部信息,告诉数据库对指定的集合做

插入操作.用批量插入的话,数据库就不用重复的处理每个文档的这种头部信息了.

当前版本MongoDB消息的最大长度是16M,使用批量插入是有这个限制的.

插入的原理和作用

当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送入数据库.数据库解析

BSON,检验是否包含"_id"键并且不超过16M,除此之外,不做别的验证,就只是简单的将文档原样的

存入数据库.这样做的坏处是允许插入无效的数据,好处是能让数据库更加安全,远离注入式攻击.

所有的主流语言的驱动会在传送数据之前进行一些数据的有效性检查(文档是否超长,是否含非utf-8的字符,

是否使用了未知类型).同样也可以启动数据库服务器的时候使用--objcheck选项,这样服务器就会在插入

之前先检验文档结构的有效性,当然这样要牺牲性能.

查看doc文档转化为BSON的大小(以字节为单位),在shell中使用Object.bsonsize(doc)

删除文档

db.users.remove()

会删除users集合的所有文档,但不会删除集合本身,原有的索引也会保留.

remove函数可以接受一个查询文档作为可选参数,给定这个参数,只有符合条件的文档才会被删除.

db.users.remove({"name":"Refactor"})

删除数据的永久性的,不能撤销和恢复.

如果要清除整个集合,直接删除集合(然后重建索引)比删除集合中所有的文档要快.

删除集合:db.drop_collection("users")

更新文档

update有两个参数,一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述对找到的文档进行那些更改

更新的操作是原子性的,若两个更新同时发生,先到服务器的先执行,然后执行另一个.最后的更新会显示在数据库

文档替换

更新最简单的就是使用一个新文档来替代匹配的文档,这适用于模式结构发生较大变化的时候.如将下面的文档

{
  "name":"refactor",
  "friends":20,
  enemies:2
}

更改为

{
  "name":"refactor",
  "relationships":
  {
    "friends":20,
    enemies:2
  }
}

 使用修改器

通常文档只会有一部分更新,利用原子的"更新修改器",更新修改器是特殊的键,用来指定复杂的更新操作,比如:

调整,增加,删除键,操作数组,操作内嵌文档.

一般网站都有计数器,来记数公有多少人访问,可以使用原子修改器原子性的完成整个功能.如:

"$set"修改器入门

"$set"用来指定一个键的值,如果键不存在,则创建,这对更新模式或者增加用户定义键来说很方便.

如:
db.users.insert(
  {
    "name":"refactor",
    "age":23,
    "sex":"male"
  }
)
添加喜欢的书籍:
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":"war and peace"}
  }
)
db.users.findOne(
  {"name":"refactor"}
 )
修改喜欢的数据
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":"war and peace2"}
  }
)
"$set"可以修改键的数据类型,如果喜欢多本书,
将book键的值变为一个数组
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":["war and peace","war and peace2"]}
  }
)
使用"$unset"将键删除,没有要删除的键也不报错
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$unset":{"book":1}
  }
)
使用"$set"修改内嵌文档
db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "author":
    {
      "name":"refactor",
      "email":"295240648@163.com"
    }
  }
)

db.blog.update(
  {
    "author.name":"refactor"
  },
  {
    "$set":{"author.name":"refactor2"}
  }
)
db.blog.findOne(
  {
    "title":"refactor's blog"
  }
)
增加,修改,删除键的时候,应该使用$修改器.一定要使用$开头的修改器来修改键值对.

使用"$inc" 增加和减少

"$inc"用来增加已有键的值,若不存在键,则增加.用于分析数据,因果关系,投票或其他有变化值的地方.

如:

db.users.insert(
  {"url":"http://www.cnblogs.com/refactor"}
)

使用"$inc" 增加一个键pageViews,默认值为10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":10000}}
)

使用"$inc"给键pageViews,再增加10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":10000}}
)

使用"$inc"给键pageViews,再减少10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":-10000}}
)

"$inc"和"$set"用法相似,用来增加或减少数字."$inc"只能用于整数,长整数或双精度浮点数.

虽然很多语言能将 null,bool,有数字构成的字符串 转化成 数字,但使用"$inc"仍会报错:

"$inc"键的值也必须为数字.

数组修改器

"$push"和"$pop"只能用于数组.

如果指定的键已存在,"$push"会向已有的数组末尾加入一个元素,如果键不存在,就创建一个新数组.

如:

db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "author":
    {
      "name":"refactor",
      "email":"295240648@163.com"
    }
  }
)

向以上文档中,添加一个包含一个数组的"comment"键,还向 comment 数组push一个评论.

这个数组会自动创建,并加入评论:

db.blog.update(
  {"title":"refactor's blog"},
  {
    $push:
    {
      "comments":
      {
        "name":"refactor2",
        "content":"nice"
      }
    }
  }
)

还想添加一条评论:

db.blog.update(
  {"title":"refactor's blog"},
  {
    $push:
    {
      "comments":
      {
        "name":"refactor3",
        "content":"good"
      }
    }
  }
)

如果一个值不在数组里就把它加进去.可以在查询文档时使用"$ne".

使用"$addToSet"

db.users.insert(
  {
    "userName":"refactor",
    "emails":
    [
      "295240648@163.com",
      "295240648@126.com"
    ]
  }
)

向emails添加新地址,用"$addToSet"避免重复

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":"295240648@163.com"
    }
  }
)

这样"295240648@163.com" 不会插入到emails中

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":"295240648@qq.com"
    }
  }
)

这样"295240648@qq.com" 会插入到emails中 

将"$addToSet"和"$each"一起使用,可以添加不同的值.

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":
      {
        "$each":
        [
          "295240648@111.com",
          "295240648@112.com",
          "295240648@113.com"
        ]
      }
    }
  }
)

使用"$pop",可以从数组任何一端删除元素.

{$pop:{key:1}}从数组末尾删除一个元素
{$pop:{key:-1}}从数组头部删除一个元素

使用"$pull",可以根据特定条件删除元素,也可以根据位置删除元素

db.users.update(
  {"userName":"refactor"},
  {
    "$pull":
    {
      "emails":"295240648@111.com"
    }
  }
)

"$pull"会将所有匹配的部分删掉,对于数组[1,1,2,1]执行pull 1,得到的结果数组是[2]


推荐阅读
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 应对.avast后缀勒索病毒:全面指南
    本文详细介绍了.avast后缀勒索病毒的特性、感染途径、恢复方法及预防措施,旨在帮助用户有效应对这一威胁。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • MongoDB集群配置:副本集与分片详解
    本文详细介绍了如何在MongoDB中配置副本集(Replica Sets)和分片(Sharding),并提供了具体的步骤和命令,帮助读者理解并实现高可用性和水平扩展的MongoDB集群。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 掌握Spring MVC中自定义类型转换与格式化的技巧
    近期,在开发一款小程序的过程中遇到了几个Spring MVC接口需要传递时间参数的问题。本文将详细介绍如何利用Java 8 Time API在Spring MVC中实现时间参数的自定义类型转换和格式化。 ... [详细]
  • 本文详细列举了软件开发中常见的功能测试要点,涵盖输入框、搜索、添加/修改、删除、文件上传下载等多个方面,旨在帮助测试人员全面覆盖测试需求,确保软件质量。 ... [详细]
author-avatar
mobiledu2502858393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有