MongoDB数据库的CURD的一些基本语句

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

插入文档:
SQL语句:
INSERT INTO 表名 (列名.......) VALUES(对应的列值.........);
MongoDB语句:
db.集合名.insert({键:值,键:值,键:值.........})


db.集合名.save({键:值,键:值,键:值........})
save()方法和insert()方法的区别在于,save会先判断集合当中是否存在相同的文档,如果存在不执行插入,如果不存在则执行插入。
删除文档:
SQL语句:
DELETE FROM 表名 WHERE 条件
MongoDB语句:
db.集合名.remove({匹配条件})
修改文档:
SQL语句:
UPDATE 表名 SET 列名=值 WHERE 条件
MongoDB语句:
db.表名.update({条件},{要更改的内容},upsert,是否批量修改)
在MongoDB中,update方法有四个参数:
第一个参数:是匹配条件,与SQL语句当中的where条件一样
第二个参数:更新内容,要更改成什么样,写在这里
第三个参数:upsert,如果为true,那集合中有满足第一个条件的文档,就执行更新,如果没有满足第一个条件的文档,就执行插入以条件为内容的新文档,再更新成第二个参数。
第四个参数:如果设为true,则更新所有满足以第一个参数为条件的文档,否则,只更新一条。
好,那么我来给大家说下MongoDB当中常用的修改器:
1.$set 修改器
使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$set':{"name":"捷哥浅谈MongoDB"}},0,1)
这条命令的意思是:将满足name为"捷哥浅谈PHP"的文档的name键更改成"捷哥浅谈MongoDB"
例如:我们原来的文档为:{"name":"捷哥浅谈PHP","age":1,"total":11}
更新以后的文档为:{"name":"捷哥浅谈MongoDB","age":1,"total":11}
如果我们不加$set,直接写成:db.collname.update({"name":"捷哥浅谈PHP"},{"name":"捷哥浅谈MongoDB"},0,1)
大家想想会是什么样的结果?
如果不加$set的话,更新后的文档将会是:
{"name":"捷哥浅谈MongoDB"}
其他的键都会被”干掉“,只留下name键,这显然不是我们想要的结果,所以在update方法中,$set是最常用的修改器。
2.$unset 修改器
说到unset,还记得PHP当中的unset()函数吗,它的功能是删除一个已声明的变量。
同样,在我们的MongoDB当中,$unset是删除文档当中的一个键
使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$unset':{"age":1}},0,1)
更新后的文档:{"name":"捷哥浅谈PHP","total":11}
age键会被删除掉。
3.$inc 增加或减少
使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$inc':{"total":1}},0,1)
意思是让total键自增1,写几就自增几,如果为负数,即为自减
更新后的文档:
{"name":"捷哥浅谈PHP","age":1,"total":12}
童鞋们考虑一下,如果我现在有这样一个微博的文档,内含每个人的评论信息:

  1. {
  2. "title":"捷哥浅谈PHP",
  3. "content":"捷哥浅谈PHP篇篇文章经典",
  4. "comm":[
  5. {
  6. "name":"打酱油的",
  7. "content":"捷哥太强啦!"
  8. },
  9. {
  10. "name":"赵桐正",
  11. "content":"这个系列文章太好啦!"
  12. },
  13. {
  14. "name":"李强强",
  15. "content":"很好的帮助了我"
  16. }
  17. ]
  18. }

如果有一个新的用户“李文凯”,来评论这条微博,内容为:“内容很精彩,千万不要错过哦!”,该怎么样往这条微博里面插入。
这就用到了咱们的数组修改器:
我们来看:
1.$push 修改器
作用:向数组末尾插入一个元素,如果没有就创建一个新的数组
使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$push':{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}})
更新后的文档为:

  1. {
  2. "title":"捷哥浅谈PHP",
  3. "content":"捷哥浅谈PHP篇篇文章经典",
  4. "comm":[
  5. {
  6. "name":"打酱油的",
  7. "content":"捷哥太强啦!"
  8. },
  9. {
  10. "name":"赵桐正",
  11. "content":"这个系列文章太好啦!"
  12. },
  13. {
  14. "name":"李强强",
  15. "content":"很好的帮助了我"
  16. },
  17. {
  18. "name":"李文凯",
  19. "content":"内容很精彩,千万不要错过哦!"
  20. }
  21. ]
  22. }

童鞋们,如果我现在有这样的需求,如果用户“李文凯”已经评论过此微博,我们就不让其再进行评论,大家思考一下,要怎么做?
我们是否可以通过判断来做,先写一个伪代码,------》如果评论内容中存在要更新的新评论,即name和content的值在评论当中已经存在,我们就不执行更新,否则则更新插入name为“李文凯”的新评论,这样可以有效的防止灌水。
好,我们用代码来实现:
db.collname.update({"name":" 李文凯","comm":{'$ne':{"name":"李文凯","content":"内容很精彩,千万不要错过哦!"}}},{'$push' :{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}});
这样判断会造成很大的麻烦,我们的$addToSet修改器本身就带有这样的功能,我们来试试:
2.$addToSet修改器
要完成以上需求,我们可以这样来做:
db.collname.update({"name":"李文凯"},{'$addToSet' :{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}});
大家可以看到,$addToSet前面不需要进行判断,就能达到我们的$ne配合$push完成的效果。
如果我们现在要更改评论里面的name为“李文凯”的评论内容,我们需要使用数组的定位修改器$:
db.collname.update({"comm.name":"李文凯"},{'$set':{"comm.$.content":"我是李小凯"}})
大家再考虑这样一个问题,如果我们的一个用户集合当中,存在一个用户文档,里面有姓名,性别,年龄,爱好(以数组的形式存储)等键,例如:

  1. {
  2. "name":"捷哥",
  3. "sex":"纯爷们",
  4. "age":27,
  5. "hobby":[
  6. "football",
  7. "basketball",
  8. "sing"
  9. ]
  10. }

我们现在有这样一个需求,在网页当中如果用户勾选了某些爱好的复选框,我们就批量执行插入这些爱好。
有些童鞋会这样想,我们使用$push或者$addToSet直接插入数组就行:
db.user.update({"name":"捷哥"},{'$push':{"hobby":["PHP","JAVA"]}})
大家认为这样可以吗?答案是否定的,执行该条语句后的结果为:

  1. {
  2. "name":"捷哥",
  3. "sex":"纯爷们",
  4. "age":27,
  5. "hobby":[
  6. "football",
  7. "basketball",
  8. "sing",
  9. [
  10. "PHP",
  11. "JAVA"
  12. ]
  13. ]
  14. }

这显然不是我们想要的结果,这样就需要我们使用$each来配合$addToSet来使用。
3.$each
我们来看$each,这里我们这样来实现:
db.user.update({"name":"捷哥"},{'$addToSet':{"hobby":{'$each':["PHP","JAVA"]}}})
这样我们更新后的文档为:

  1. {
  2. "name":"捷哥",
  3. "sex":"纯爷们",
  4. "age":27,
  5. "hobby":[
  6. "football",
  7. "basketball",
  8. "sing",
  9. "PHP",
  10. "JAVA"
  11. ]
  12. }

正如童鞋们所见,这样的结果才是我们想要的结果。
注意:$each不能使用$push配合使用,只能使用$addToSet。
4.$pop 修改器
作用:删除数组的第一个元素或者最后一个元素
使用方法:db.user.update({"name":"捷哥"},{'$pop':{"hobby":1}});
修改后的文档就会变成:

  1. {
  2. "name":"捷哥",
  3. "sex":"纯爷们",
  4. "age":27,
  5. "hobby":[
  6. "football",
  7. "basketball",
  8. "sing",
  9. "PHP"
  10. ]
  11. }

“1”表示从数组末尾删除一个元素,“-1”表示从数组开头删除一个元素,因此,
db.user.update({"name":"捷哥"},{'$pop':{"hobby":-1}});
运行后的文档更新为:

  1. {
  2. "name":"捷哥",
  3. "sex":"纯爷们",
  4. "age":27,
  5. "hobby":[
  6. "basketball",
  7. "sing",
  8. "PHP",
  9. "JAVA"
  10. ]
  11. }

那如果我们现在要删除爱好里面的“sing”,这个元素既不是开头第一个元素,也不是末尾的最后一个元素,显然我们使用$pop已经满足不了这个需求了,这时我们就需要使用$pull修改器了。
5.$pull 修改器
作用:删除数组当中的指定元素
使用方法:db.user.update({"name":"捷哥"},{'$pull':{"hobby":"sing"}})
以上文档修改以后的文档就会变成:

  1. {
  2. "name":"捷哥",
  3. "sex":"纯爷们",
  4. "age":27,
  5. "hobby":[
  6. "basketball",
  7. "PHP",
  8. "JAVA"
  9. ]
  10. }

由此可见,$pull可以删除数组中的指定的元素,也就是说我们可以任意删除指定的爱好兴趣。
好了,今天把我们常用的修改器都给大家讲了一下,不知道大家都能看明白吗,有问题的话可以跟帖回复提问,也可以给我发邮件lijie@lampbrother.net




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/6186326.html,如需转载请自行联系原作者

相关文章
|
3月前
|
NoSQL MongoDB 数据库
数据库数据恢复—MongoDB数据库数据恢复案例
MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
3月前
|
缓存 NoSQL Linux
在CentOS 7系统中彻底移除MongoDB数据库的步骤
以上步骤完成后,MongoDB应该会从您的CentOS 7系统中被彻底移除。在执行上述操作前,请确保已经备份好所有重要数据以防丢失。这些步骤操作需要一些基本的Linux系统管理知识,若您对某一步骤不是非常清楚,请先进行必要的学习或咨询专业人士。在执行系统级操作时,推荐在实施前创建系统快照或备份,以便在出现问题时能够恢复到原先的状态。
293 79
|
3月前
|
存储 NoSQL MongoDB
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
181 8
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
|
2月前
|
运维 NoSQL 容灾
告别运维噩梦:手把手教你将自建 MongoDB 平滑迁移至云数据库
程序员为何逃离自建MongoDB?扩容困难、运维复杂、高可用性差成痛点。阿里云MongoDB提供分钟级扩容、自动诊断与高可用保障,助力企业高效运维、降本增效,实现数据库“无感运维”。
|
6月前
|
NoSQL MongoDB 数据库
数据库数据恢复——MongoDB数据库服务无法启动的数据恢复案例
MongoDB数据库数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 管理员在未关闭MongoDB服务的情况下拷贝数据库文件。将MongoDB数据库文件拷贝到其他分区后,对MongoDB数据库所在原分区进行了格式化操作。格式化完成后将数据库文件拷回原分区,并重新启动MongoDB服务。发现服务无法启动并报错。
|
7月前
|
存储 NoSQL MongoDB
微服务——MongoDB常用命令1——数据库操作
本节介绍了 MongoDB 中数据库的选择、创建与删除操作。使用 `use 数据库名称` 可选择或创建数据库,若数据库不存在则自动创建。通过 `show dbs` 或 `show databases` 查看所有可访问的数据库,用 `db` 命令查看当前数据库。注意,集合仅在插入数据后才会真正创建。数据库命名需遵循 UTF-8 格式,避免特殊字符,长度不超过 64 字节,且部分名称如 `admin`、`local` 和 `config` 为系统保留。删除数据库可通过 `db.dropDatabase()` 实现,主要用于移除已持久化的数据库。
453 0
|
7月前
|
存储 NoSQL MongoDB
从 MongoDB 到 时序数据库 TDengine,沃太能源实现 18 倍写入性能提升
沃太能源是国内领先储能设备生产厂商,数十万储能终端遍布世界各地。此前使用 MongoDB 存储时序数据,但随着设备测点增加,MongoDB 在存储效率、写入性能、查询性能等方面暴露出短板。经过对比,沃太能源选择了专业时序数据库 TDengine,生产效能显著提升:整体上,数据压缩率超 10 倍、写入性能提升 18 倍,查询在特定场景上也实现了数倍的提升。同时减少了技术架构复杂度,实现了零代码数据接入。本文将对 TDengine 在沃太能源的应用情况进行详解。
328 0
|
8月前
|
存储 NoSQL MongoDB
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
10月前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
279 15
|
10月前
|
存储 NoSQL 关系型数据库
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板

热门文章

最新文章

推荐镜像

更多