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

2024-06-19 04: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论坛。
<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>
阅读(79) | 评论(0) | 转发(0) |
0

上一篇:失去了翅膀,却依然坚信只要拼搏就可以飞翔

下一篇:浅谈“明哥”生活不顺,其实最近也不顺,碰见小人了!

相关热门文章
  • 《数字技术与应用》征稿**投稿...
  • 关于分库分表(Mysql篇)
  • 数据库性能监控工具ORATOP...
  • 欢迎shuziliang在ChinaUnix博...
  • PHP程序员战地日记
  • phpStudy 2013下载,PHP5开发...
  • 草和谐榴社区caoliushequ...
  • 灵芝的种类和图片
  • 为PHP添加GD库支持
  • 秋天的惆怅
  • 大家都是用什么来管理hadoop集...
  • 网站被人挂了吗,添加了些程序...
  • Nginx如何保证不走宕机的那个...
  • 大家谈谈MYSQL客户端和服务器...
  • 以下代码运行后为何会输出5?...
给主人留下些什么吧!~~
评论热议

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



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

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3