【捷哥浅谈PHP】第十二弹---NoSQL数据库之MongoDB的CURD操作(三)

2024-06-19 06:58

本文主要是介绍【捷哥浅谈PHP】第十二弹---NoSQL数据库之MongoDB的CURD操作(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HELLO,各位童鞋,我又上来唠叨啦,不知道昨天的内容大家能否消化呢?

我相信这点内容对大家都是小case,一定So easy,如果学习过程当中遇到什么问题,一定要给我反馈哦,我的微博,邮箱,BBS,个人博客,统统为大家开放!


好了,不多说了,我今天给大家唠叨点啥呢?

今天我来给大家带上MongoDB查询方法的详细讲解,内含各种案例,各种精彩,不容错过!

我们先来回顾下上文的内容,上文我给大家详细讲了下MongoDB的update方法以及常用的修改器,希望大家能够下来多加练习,巩固所学知识。

至此,我们对MongoDB的增、删、改方法都已经搞定,那么今天就来带大家学习MongoDB的查询方法,学完MongoDB的这个方法,我们就可以写一个BBS论坛了,怎么样,是不是很兴奋啊。

那我们开始,首先我们先来回顾下SQL语句当中的查询语法是什么样的?

SELECT 字段1,字段2[,字段3[,字段4]......... ] FROM 表名 [ WHERE 条件 ] [ ORDER BY 字段名 DESC|ASC ] [ LIMIT [记录偏移量,]显示的记录总数 ]

在SQL语句当中我们使用SELECT语句,而在MongoDB当中,我们使用find和findOne方法:

find方法:

功能:查询集合中的文档

使用方法:db.user.find()

参数:

第一个参数为要查询的条件

第二个参数为要显示或不要显示的键名

我们来看一个例子:

现在我们来批量插入一组数据:
  1. > for(i = 1; i <= 20; i++){
  2. > ...db.user.insert(
  3. { "name": "李文凯"+i+"号",
  4. "age":20+i,
  5. "alias":"作业屠夫",
  6. "girlfriend":[
  7. {"name":"凤姐","age":18},
  8. {"name":"芙蓉姐姐","age":19},
  9. {"name":"小月月","age":20}
  10. ],
  11. "hobby":["抽烟","喝酒","把妹"],
  12. "baobiao":[
  13. {"name":"李强强","alias":"小而强大"},
  14. {"name":"孙珊珊","alias":"美丽动人纯情妞"},
  15. {"name":"张涛","alias":"外纯内骚"}
  16. ]
  17. }
  18. );
  19. > ...}
  20. >


因为MongoDB的shell客户端是JS引擎,所以在MongoDB的客户端下可以使用JS的语法,

因此插入命令执行后,集合中会出现20条新文档:
  1. { "name": "李文凯1号",
  2. "age":21,
  3. "alias":"作业屠夫",
  4. "girlfriend":[
  5. {"name":"凤姐","age":18},
  6. {"name":"芙蓉姐姐","age":19},
  7. {"name":"小月月","age":20}
  8. ],
  9. "hobby":["抽烟","喝酒","把妹"],
  10. "baobiao":[
  11. {"name":"李强强","alias":"小而强大"},
  12. {"name":"孙珊珊","alias":"美丽动人纯情妞"},
  13. {"name":"张涛","alias":"外纯内骚"}
  14. ]
  15. }
  16. <-------------------------------------------------------------------------------->
  17. { "name": "李文凯2号",
  18. "age":22,
  19. "alias":"作业屠夫",
  20. "girlfriend":[
  21. {"name":"凤姐","age":18},
  22. {"name":"芙蓉姐姐","age":19},
  23. {"name":"小月月","age":20}
  24. ],
  25. "hobby":["抽烟","喝酒","把妹"],
  26. "baobiao":[
  27. {"name":"李强强","alias":"小而强大"},
  28. {"name":"孙珊珊","alias":"美丽动人纯情妞"},
  29. {"name":"张涛","alias":"外纯内骚"}
  30. ]
  31. }
  32. <-------------------------------------------------------------------------------->
  33. { "name": "李文凯3号",
  34. "age":23,
  35. "alias":"作业屠夫",
  36. "girlfriend":[
  37. {"name":"凤姐","age":18},
  38. {"name":"芙蓉姐姐","age":19},
  39. {"name":"小月月","age":20}
  40. ],
  41. "hobby":["抽烟","喝酒","把妹"],
  42. "baobiao":[
  43. {"name":"李强强","alias":"小而强大"},
  44. {"name":"孙珊珊","alias":"美丽动人纯情妞"},
  45. {"name":"张涛","alias":"外纯内骚"}
  46. ]
  47. }
  48. <-------------------------------------------------------------------------------->
  49. { "name": "李文凯4号",
  50. "age":24,
  51. "alias":"作业屠夫",
  52. "girlfriend":[
  53. {"name":"凤姐","age":18},
  54. {"name":"芙蓉姐姐","age":19},
  55. {"name":"小月月","age":20}
  56. ],
  57. "hobby":["抽烟","喝酒","把妹"],
  58. "baobiao":[
  59. {"name":"李强强","alias":"小而强大"},
  60. {"name":"孙珊珊","alias":"美丽动人纯情妞"},
  61. {"name":"张涛","alias":"外纯内骚"}
  62. ]
  63. }
  64. <-------------------------------------------------------------------------------->
  65. { "name": "李文凯5号",
  66. "age":25,
  67. "alias":"作业屠夫",
  68. "girlfriend":[
  69. {"name":"凤姐","age":18},
  70. {"name":"芙蓉姐姐","age":19},
  71. {"name":"小月月","age":20}
  72. ],
  73. "hobby":["抽烟","喝酒","把妹"],
  74. "baobiao":[
  75. {"name":"李强强","alias":"小而强大"},
  76. {"name":"孙珊珊","alias":"美丽动人纯情妞"},
  77. {"name":"张涛","alias":"外纯内骚"}
  78. ]
  79. }
  80. <-------------------------------------------------------------------------------->
  81. /\
  82. ||
  83. ||
  84. ||
  85. 中间省略.....
  86. ||
  87. ||
  88. ||
  89. \/
  90. <-------------------------------------------------------------------------------->
  91. { "name": "李文凯20号",
  92. "age":40,
  93. "alias":"作业屠夫",
  94. "girlfriend":[
  95. {"name":"凤姐","age":18},
  96. {"name":"芙蓉姐姐","age":19},
  97. {"name":"小月月","age":20}
  98. ],
  99. "hobby":["抽烟","喝酒","把妹"],
  100. "baobiao":[
  101. {"name":"李强强","alias":"小而强大"},
  102. {"name":"孙珊珊","alias":"美丽动人纯情妞"},
  103. {"name":"张涛","alias":"外纯内骚"}
  104. ]
  105. }


好,如上所示,我们新插入了20条文档,

如果查询name为"李文凯1号"的文档,我们来这样做:

我们刚才讲了,find()方法的第一个参数为要查询的文档所要满足的条件,第二个参数为要显示的键名或者不要显示的键名,

那么好,我们就会使用find()方法了:

db.user.find({"name":"李文凯1号"},{"_id":0});

这就类似于我们的SQL语句:

SELECT name,age,alias,girlfriend,hobby,baobiao FROM user where name="李文凯1号"

这样就不会显示"_id"键,其他键都会显示。

说到这里,第二个参数是"key":0或者1,0代表不显示,1代表显示,如果加了"name":1,则除了"_id"和"name",其他键都不会显示,也就是说"_id"如果不设为0,则默认会显示

下面,我们把条件复杂化一些来看:

例如:

我们要查询age大于30并且小于40的所有用户,find()方法应该怎么写?

SQL语句:

SELECT * FROM user WHERE age>30

MongoDB语句:

db.user.find({"age":{'$gt':30,'$lt':40}})

如上所示:

”大于“我们使用$gt

”小于“我们使用$lt

同理,”大于等于“和”小于等于“我们分别使用”$gte“和”$lte“

而”不等于“我们使用”$ne“

注意:在MongoDB当中,没有”$eq“,”等于“我们使用的是冒号":"

如果我们要满足name为”李文凯1号“或者name为”李文凯5号“的文档,要怎么做

在SQL语句中:

SELECT * FROM user WHERE name="李文凯1号" or name=”李文凯5号“

或者:

SELECT * FROM user WHERE name in("李文凯1号","李文凯5号")

那在MongoDB当中:

db.user.find({"name":{'$in':["李文凯1号","李文凯5号"]}})

如上所示,MongoDB当中的$in的功能与SQL语句当中的in的功能是一样的,语法结构为:

"key":{$in:[值1,值2,值3,........]}

同样,$nin的语法结构与$in的语法结构完全相同,但意思完全相反。

又如:

我们需要查询name为”李文凯1号“或者age为大于等于30的用户,要怎么做?

在SQL语句当中:

SELECT * FROM user WHERE name="李文凯1号" or age>=30

在MongoDB当中,显然我们使用$in已经满足不了我们的需求,因此我们可以使用$or:

db.user.find({'$or':[{"name":"李文凯1号"},{"age":{'$gte':30}}]})

这里的$or与SQL语句当中的or作用相同,

这里要注意:$or后面是两个不同的键,并且用数组的形式传递,数组的每一个元素是不同的键要满足的不同条件的对象,

因此$or语法结构为:

'$or':[{"key1":条件},{"key2":条件},{"key3":条件}]

那么同样,我们可以使用$or来满足上例的需求:

db.user.find({'$or':[{"name":"李文凯1号"},{"name":"李文凯5号"}]})

我们来总结一下:

$in和$nin主要针对同一键的值的或关系

$or主要针对不同键的值的或关系,同样可以针对同一键的值的或关系

接下来,我们再看,倘若我们要满足一下需求:

我们要找出所有年龄为偶数的用户文档对象,该怎么做?

SQL语句中:

SELECT * FROM user WHERE age%2=0

在MongoDB当中,我们可以使用$mod:

db.user.find({"age":{'$mod':[2,0]}})

取奇数可以这样:

db.user.find({"age":{'$mod':[2,1]}})

或者:

db.user.find({"age":{'$not':{'$mod':[2,0]}}})

由此可见,MongoDB中的$not是取反的意思,也就是偶数取反,即为奇数。

下面,如果我们插入一条新文档:
  1. { "name": "李文凯21号",
  2. "age":41,
  3. "alias":"作业屠夫",
  4. "girlfriend":[
  5. {"name":"芙蓉姐姐","age":19},
  6. {"name":"小月月","age":20}
  7. ],
  8. "hobby":["抽烟","喝酒","把妹"],
  9. "baobiao":[
  10. {"name":"李强强","alias":"小而强大"},
  11. {"name":"孙珊珊","alias":"美丽动人纯情妞"},
  12. {"name":"张涛","alias":"外纯内骚"}
  13. ],
  14. "children":null
  15. }


现在我们要查询这条文档,很多童鞋会这样做:

db.user.find({"children":null})

而我们这样做的后果,是会显示所有的文档,因为其他文档当中没有”children“键,这样也会被查询出来,

所以我们需要加一个判断:”如果‘children’的值为null,并且‘children’键存在“:

db.user.find({"children":{'$in':[null],'$exists':1}})

这就需要我们配合$in来使用查询。

又如:

我们需要查询”girlfriend“键中包含name为”凤姐“的所有文档:

这个需求当中的”girlfriend“键是一个数组,因此我们需要在数组当中去搜索name包含”凤姐“的元素,我们这里使用$all:

db.user.find({"girlfriend.name":{'$all':['凤姐']}})

$all后面可以有多个值,来进行搜索同时包含多个值的数组。

如果我们要查询满足用户的"girlfriend"个数为3个的文档,我们可以使用'$size':

db.user.find({"girlfriend":{'$size':3}})

如果我们要列出满足某个条件的文档的”baobiao“键的前两条内容,我们需要使用$slice:

db.user.find({条件},{"baobiao":{'$slice':2}})

那自然,返回后两条为:

db.user.find({条件},{"baobiao":{'$slice':-2}})

如果只返回中间的一条

db.user.find({条件},{"baobiao":{'$slice':[1,1]}})

中括号内的第一个元素为略过几个元素,第二个元素是列出几条元素

又如:

如果我们要查询"girlfriend"键中的"name"为”芙蓉姐姐“的,并且”age“键大于19的文档,要怎么做?

我们可以使用$elemMatch来匹配:

db.user.find({"girlfriend":{'$elemMatch':{"age":{'$gt':19},"name":"芙蓉姐姐"}}})

$elemMatch的功能为:匹配数组当中的单个内嵌文档的限定条件。

再比如说,捷哥今天去买了五篮子水果,假设每篮子水果一个文档对象:
  1. {
  2. "apple":7,
  3. "banana":5,
  4. "peach":10,
  5. "watermelon":1
  6. }
  7. <-------------------------------------->
  8. {
  9. "grape":7,
  10. "banana":7,
  11. "peach":10,
  12. "watermelon":1
  13. }
  14. <-------------------------------------->
  15. {
  16. "apple":7,
  17. "banana":10,
  18. "grape":10,
  19. "watermelon":1
  20. }
  21. <-------------------------------------->
  22. {
  23. "apple":3,
  24. "orange":15,
  25. "peach":5,
  26. "watermelon":5
  27. }
  28. <-------------------------------------->
  29. {
  30. "apple":7,
  31. "banana":5,
  32. "peach":10,
  33. "watermelon":1
  34. }
  35. <-------------------------------------->


我们现在需要查询出这五篮水果中的任意两种水果的数量相同的水果篮,显然用我们前面所学的所有匹配内容的魔术方法都无法匹配,我们这里需要用到一个万能的魔术方法:


$where,因为MongoDB的客户端是JS引擎,所以我们可以使用JS代码来实现匹配:
  1. db.fruit.find({'$where':function(){
  2. for(i in this){
  3. for(j in this){
  4. if(this[i]==this[j] && i!=j){
  5. return true;
  6. }
  7. }
  8. }
  9. return false;
  10. }
  11. }
  12. )



$where几乎可以实现所有的匹配条件,但是效率很低,所以不建议使用,除非有特别难匹配的条件,我们可以偶尔使用$where。


除find()方法外,MongoDB还提供一个查询方法,是findOne()方法,它的作用是只列出满足条件的文档中的一条,使用方法与find()方法完全一样,这里就不多说了。


至此,MongoDB的增、删、改、查的方法我们都已经掌握,但是我们怎样用PHP连接MongoDB数据库呢,童鞋们别急,下文我将会给家详细讲解,MongoDB数据库的游标,索引,以及怎样使用PHP连接MongoDB数据库来做一个小型的BBS论坛。


你的各种期待将会带来各种精彩!

原文地址:http://bbs.lampbrother.net/read-htm-tid-119735.html

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(101) | 评论(0) | 转发(0) |
0

上一篇:闲聊

下一篇:兄弟连 40 期 临行时刻

相关热门文章
  • 《数字技术与应用》征稿**投稿...
  • 关于分库分表(Mysql篇)
  • 数据库性能监控工具ORATOP...
  • 欢迎shuziliang在ChinaUnix博...
  • PHP程序员战地日记
  • IP Sec VPN与NAT破镜重圆
  • 网站导航
  • GoAgent图文设置教程
  • UT2.0正式版下载
  • tomcat6.0配置(含配置视频下载...
  • 大家都是用什么来管理hadoop集...
  • 网站被人挂了吗,添加了些程序...
  • Nginx如何保证不走宕机的那个...
  • 大家谈谈MYSQL客户端和服务器...
  • 以下代码运行后为何会输出5?...
给主人留下些什么吧!~~
评论热议

这篇关于【捷哥浅谈PHP】第十二弹---NoSQL数据库之MongoDB的CURD操作(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074324

相关文章

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu