最近的一个项目中用到了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. unicode,ansi,utf-8,unicode big endian编码的区别

    知乎--http://www.zhihu.com/question/23374078 http://wenku.baidu.com/view/cb9fe505cc17552707220865.html ...

  2. 触发器事件trigger

    修改mysql结束符   delimiter name 触发器语法:     create trigger 触发器名称       after/before  触发时间     //错误  ERROR ...

  3. 富文本编辑器防止xss注入javascript版

    富文本编辑器:ueditor 其实富文本编辑器已经有防止xss注入功能,但是你服务端程序在接收的时候在做一次转义,否则有可能然后前端验证直接提交数据导致被xss攻击. 为了节省后端程序开销则在前端 显 ...

  4. java1234教程系列笔记 S1 Java SE 02 eclipse初步使用、注释、标识符

    第二章 第一节,讲了简单使用eclipse 写控制台程序.没有讲包,直接用的默认的包名. 还是编写了两个控制台例子 public class HelloWorld { public static vo ...

  5. 调试新技能get - powershell

    1. win+r -> powershell_ise 2. debug-process 3. type processname....WITHOUT ".exe"

  6. ajax-服务器响应

    如果需要获得了来自服务器的响应,则使用XMLHttpRequest 对象的 responseText 或 responseXML 属性 responseText: 获得字符串形式的响应数据,当read ...

  7. chmod、chown、chgrp的意思

    文件权限管理chown->change owner 改变文件所有者chown test install.log -将install.log这个文件的所有者改为test用户 chgrp->c ...

  8. 常用Java排序算法

    常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...

  9. 在Eclipse中使用JUnit4进行单元测试(高级篇)

    通过前2篇文章,您一定对JUnit有了一个基本的了解,下面我们来探讨一下JUnit4中一些高级特性. 一.高级Fixture 上一篇文章中我们介绍了两个Fixture标注,分别是@Before和@Af ...

  10. 读写hdfs文件(工作笔记)

    import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; ...