最近的一个项目中用到了MongoDB,主要是使用MongoDB的PHP扩展。MongoDB的扩展中用于一个用于查询的方法是find()。下面针对在理解MongoDB扩展的find()方法中做的实验做个简单的笔记,同时希望能够帮助别人。

  MongoDB的PHP扩展中,可以使用MongoColletion的find($query,$fileds)进行查询,其中find()根据$query的条件进行匹配查询,$query中说明需要返回的字段。使find()的时候,需要注意的事项是,所有待查询的变量都必须使用单引号括起来,这样才不至于用变量的值代替命令。另外一个需要注意的情况是,$fields表示的要返回的项,在$field中所有的要显示的字段都对应与1,而不显示的项对应的值为0,而且0只用于'_id'字段,用于别的字段会导致错误。$query和$都是以数组的形式传递给find(),mongoDB的PHP扩展的参数都是使用数组的形式进行传递。

  标准做法下,$fields数组中不会使用引号(这里以及下文如果不进行特别的说明,括号包括大括号和小括号)将0引起来,这样会导致0无法起作用,但是将1引起来却不会有什么影响,提倡大家使用标准做法。为了说明给$fields字段加引号之后会有什么不同,下面进行几个实验以说明其影响。

  一、标准做法

  $field数组中'_id'字段的值为0不加引号,其余要显示的所有字段均为1。

  

(a)

(b)

图 1 标准做法

  当连上MongoDB选择数据库和集合之后使用find()查找,返回的结果是其实是cursors,如果想要显示出来返回的结果,需要使用iterator_to_array()将返回的结果转化为数组的形式。由图 1(b)的结果可以看出,返回的结果中不带有'_id'字段,且返回的结果中数组的key为[0]。这里需要说明一下,MongoDB为每个插入的文档添加一个'_id'字段,且在查找的过程中,如果不指定'_id'字段为0,则其默认出现在返回的结果中。如图 2(a) (b)所示,在没有指定$query数组中的'_id'字段的时候,默认是输出'_id'字段的,且此时输出的结果中,key不再是以[0]开始的数字下标,而是原来文章中的'_id'字段的值。

(a)

  

(b)

图 2 不指定'_id'字段为0的情况

  二、将0用引号引起来

  如果将0用引号引起来,在$fields字段加入'_id'=>'0'或者'_id'=>"0",则'_id'字段将依然显示出来,且此时返回的结果数组中对应的数组的key也不是从[0]开始的,而是原来的文档中的'_id'字段对应的value值作为数组的'key'值。如下图所示。

(a)

(b)

(c)

图 3 为$fields数组中的'_id'字段加上引号

  三、在$fileds数组中除'_id'字段以外使用0

  前面已经说过,0只能用在'_id'字段用于控制是否显示'_id'字段的值,但是绝不能用于其他的字段,如果用于其他的字段则导致程序报错。如下图所示,将'tags'字段设置为0,导致程序报错。

(a)

(b)

图 4 $field数组中别的字段使用0的出错情况

  这也就是表明了用于存储返回值的$fields数组中,将想要显示的字段的值设置为1,不设置的字段不显示,但是决不允许在除'_id'字段之外的其余字段使用0。

  小结:

  初学Mongo,以后遇到问题在和大家一起学习。抱歉的是图不太清楚,当时是将图截下来保存在word中,再使用的时候就已经不太清楚了。

mongoDB学习记录---PHP扩展的find返回值的更多相关文章

  1. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

  2. (转)SpringMVC学习(七)——Controller类的方法返回值

    http://blog.csdn.net/yerenyuan_pku/article/details/72511844 本文所有案例代码的编写均建立在前文SpringMVC学习(六)——SpringM ...

  3. MongoDB学习记录(二) - MongoDB的"增查改删"操作之"增"

    如果做插入文档操作的集合不存在,那么集合将被创建 db.collection.insertOne() insertOne为collection插入一条文档,如果文档的_id字段未指定,MongoDB会 ...

  4. MongoDB 学习记录(二)yum安装

    前言:接着上篇继续学习MongoDB,这次学习的是在Linux下安装MongoDB 环境:centos7.3 安装版本:MongoDB4.0 官网安装教程地址 https://docs.mongodb ...

  5. MongoDB学习记录(四) - MongoDB的"增查改删"操作之"改"

    更新文档主要有以下几种方法: db.collection.updateOne(filter, update, options) db.collection.updateMany(filter, upd ...

  6. MongoDB 学习记录(一)

    前言:之前一直只是简单了解MongoDB,而且是随便看看的那种,今天决定好好的整理一下,以便自己能  温故而知新 1.MongoDB是什么 MongoDB 是一个高性能,开源,无模式的文档型数据库,开 ...

  7. MongoDB学习记录(一) - 安装、启动与建立数据库

    简要说明一个基本概念:MongoDB中的三要素:数据库(database).集合(collection)和文档(document). 文档:类似于JSON对象,由字段(field)和值(value)组 ...

  8. MongoDB学习记录(三) - MongoDB的"增查改删"操作之"查"

    查找使用的方法: db.collection.find() 查找所有文档 db.collection.find({})或者db.collection.find({}) 指定键值对 db.collect ...

  9. mongodb学习(二)分级查询数组中的值

    (PS: 标题有点不妥当...) 大概是这样...数据结构如下: 需要模糊查询title的值... mongodb中操作语句: 主要是注意这里urlElements不需要加[0]...我开始的时候写成 ...

随机推荐

  1. [原创]cocos2d-x研习录-第三阶 特性之动作

    在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode.导演类CCDirector.场景类CCScene.布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素 ...

  2. css 超过宽度显示...

    一般使用 display:block;white-space:nowrap; overflow:hidden; text-overflow:ellipsis; *****************未实验 ...

  3. Java实现多线程的三种方式

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.前两种方式启动的线程没有返回值 ...

  4. VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径

    原文链接:http://www.cnblogs.com/lidabo/archive/2012/05/29/2524170.html 说明 $(RemoteMachine) 设置为“调试”属性页上“远 ...

  5. [Nginx] - PHP+FPM相关的配置

    CodeIgniter的配置: worker_processes ; events { worker_connections ; } http { include mime.types; defaul ...

  6. zepto.js使用前注意

    API:http://www.css88.com/doc/zeptojs_api/ 一.建议:不要从官网下载,而是从 Github 下载了源代码之后自己 Build 一个版本,这样你可以自行挑选适合的 ...

  7. PHP面向对象的魔术方法.png(不间断更新)

  8. IIS7.5下发布应用程序备忘

    近期工作需要把应用程序发布升级到IIS7.5中,IIS7部署方式跟IIS6差别还是挺大的. 部署常规方式:新建虚拟目录>转成应用程序. 在本机用http://localhost/别名访问一切正常 ...

  9. 实践最简单的项目:WC

    wc.exe是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有的wc.exe的功能,并加以扩充,给出某程序设计源语言文件的字符数.单词数和行数. 给实现一 ...

  10. 快速开发一个PHP电影爬虫

    今天来做一个PHP电影小爬虫.我们来利用simple_html_dom的采集数据实例,这是一个PHP的库,上手很容易.simple_html_dom 可以很好的帮助我们利用php解析html文档.通过 ...