最近的一个项目中用到了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中,再使用的时候就已经不太清楚了。