当前位置:嗨网首页>书籍在线阅读

04-使用PHP限制返回的字段

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

14.1.2 使用PHP限制返回的字段

在方法find()中使用参数fields来减少MongoCursor对象表示的文档中的字段数 在本节中,您将编写一个简单的PHP应用程序,它在方法find()中使用参数fields来限制返回的字段。通过这个示例,您将熟悉如何使用方法find()的参数fields,并了解它对结果的影响。程序清单14.3显示了这个示例的代码。 在这个示例中,主脚本连接到MongoDB数据库,获取一个MongoCollection对象,并调用其他的方法来查找文档并显示其指定的字段。方法displayCursor()迭代游标并显示找到的文档。 方法includeFields()接受一个字段名列表,创建参数fields并将其传递给方法find(),使其只返回指定的字段;方法excludeFields()接受一个字段名列表,创建参数fields并将其传递给方法find(),以排除指定的字段。 请执行如下步骤,创建并运行这个PHP应用程序,它在示例数据集中查找文档,限制返回的字段并显示结果。 1.确保启动了MongoDB服务器。 2.确保下载并安装了PHP MongoDB驱动程序,并运行了生成数据库words的脚本文件code/hour05/generate_words.js。 3.在文件夹code/hour14中新建一个文件,并将其命名为PHPFindFields.php。 4.在这个文件中输入程序清单14.3所示的代码。这些代码在调用方法find()时传递了参数fields。 5.将这个文件存盘。 6.打开一个控制台窗口,并切换到目录code/hour14。 7.执行下面的命令来运行这个PHP应用程序。程序清单14.4显示了这个应用程序的输出。 程序清单14.3 PHPFindFields.php:在PHP应用程序中限制从集合返回的文档包含的字段 程序清单14.4 PHPFindFields.php-output:在PHP应用程序中限制从集合返回的文档包含的字段的输出

为限制文档检索时返回的数据量,另一种极有效的方式是限制要返回的字段。文档可能有很多字段在有些情况下很有用,但在其他情况下没用。从MongoDB服务器检索文档时,需考虑应包含哪些字段,并只请求必要的字段。

要对MongoCollection对象的方法find()从服务器返回的字段进行限制,可使用参数fields。这个参数是一个Array对象,它使用值true来包含字段,使用值false来排除字段。

例如,要在返回文档时排除字段stats、value和comments,可使用下面的fields参数:

$fields = array('stats' => false, 'value' => false, 'comments' => false);
$cursor = $myColl->find(null, $fields);

这里将查询对象指定成了null,因为您要查找所有的文档。

仅包含所需的字段通常更容易。例如,如果只想返回first字段为t的文档的word和size字段,可使用下面的代码:

$query = array('first' => 't');
$fields = array('word' => true, 'size' => true);
$cursor = $myColl->find($query, $fields);

▼ Try It Yourself

php PHPFindFields.php
01 <?php
02   $mongo = new MongoClient("");
03   $db = $mongo->words;
04   $collection = $db->word_stats;
05   excludeFields($collection, []);
06   includeFields($collection, ["word", "size"]);
07   includeFields($collection, ["word", "letters"]);
08   excludeFields($collection, ["chars", "letter", "charsets"]);
09   function displayCursor($doc){
10     print_r(json_encode($doc)."\n");
11   }
12   function includeFields($collection, $fields){
13     $query = array('first' => 'p');
14     $fieldObj = array();
15     foreach ($fields as $id => $field){
16       $fieldObj[$field] = true;
17     }
18     $word = $collection->findOne($query, $fieldObj);
19     print_r("\nIncluding ".json_encode($fields)." fields: \n");
20     displayCursor($word);
21   }
22   function excludeFields($collection, $fields){
23     $query = array('first' => 'p');
24     $fieldObj = array();
25     foreach ($fields as $id => $field){
26       $fieldObj[$field] = false;
27     }
28     $doc = $collection->findOne($query, $fieldObj);
29     print_r("\nExcluding ".json_encode($fields)." fields: \n");
30     displayCursor($doc);
31   }
32 ?>
Excluding [] fields:
{ "_id":{"$id":"52e89477c25e849855325fa7"},"word":"people","first":"p","last":"e",
"size":6,"letters":["p","e","o","l"],"stats":{"vowels":3,"consonants":3},
  "charsets":[{"type":"consonants","chars":["p","l"]},
                {"type":"vowels","chars":["e","o"]}]}
Including ["word","size"] fields:
{ "_id":{"$id":"52e89477c25e849855325fa7"},"word":"people","size":6}
Including ["word","letters"] fields:
{ "_id":{"$id":"52e89477c25e849855325fa7"},"word":"people","letters":["p","e","o",
"l"]}
Excluding ["chars","letter","charsets"] fields:
{ "_id":{"$id":"52e89477c25e849855325fa7"},"word":"people","first":"p","last":"e",
"size":6,"letters":["p","e","o","l"],"stats":{"vowels":3,"consonants":3}}