MongoCollection::find

(PECL mongo >=0.9.0)

MongoCollection::find查询该集合,并返回结果集的 MongoCursor

说明

public MongoCursor MongoCollection::find ([ array $query = array() [, array $fields = array() ]] )

参数

query

要搜索的字段。 MongoDB 的查询语言十分宽泛。 PHP 驱动在几乎所有的情况下会把查询直接传入服务器,所以阅读 MongoDB 关于 » find 的核心文档是个不错的主意。

Warning

请确保所有指定的查询操作符(以 $ 开头)是用单引号的,这样 PHP 才不会尝试用 $exists 变量的值来替换 "$exists" 命令。

fields

返回结果的字段。Array 的格式是 array('fieldname' => true, 'fieldname2' => true)_id 字段总会返回。

返回值

返回搜索结果的游标。

范例

Example #1 MongoCollection::find() 例子

该例子演示了基本的搜索选项。

<?php

$m 
= new MongoClient();
$db $m->selectDB('test');
$collection = new MongoCollection($db'produce');

// 搜索水果
$fruitQuery = array('Type' => 'Fruit');

$cursor $collection->find($fruitQuery);
foreach (
$cursor as $doc) {
    
var_dump($doc);
}

// 搜索甜的产品 Taste is a child of Details. 
$sweetQuery = array('Details.Taste' => 'Sweet');
echo 
"Sweet\n";
$cursor $collection->find($sweetQuery);
foreach (
$cursor as $doc) {
    
var_dump($doc);
}

?>

以上例程会输出:

array(4) {
  ["_id"]=>
  object(MongoId)#7 (1) {
    ["$id"]=>
    string(24) "50a87dd084f045a19b220dd6"
  }
  ["Name"]=>
  string(5) "Apple"
  ["Type"]=>
  string(5) "Fruit"
  ["Details"]=>
  array(2) {
    ["Taste"]=>
    string(5) "Sweet"
    ["Colour"]=>
    string(3) "Red"
  }
}
array(4) {
  ["_id"]=>
  object(MongoId)#8 (1) {
    ["$id"]=>
    string(24) "50a87de084f045a19b220dd7"
  }
  ["Name"]=>
  string(5) "Lemon"
  ["Type"]=>
  string(5) "Fruit"
  ["Details"]=>
  array(2) {
    ["Taste"]=>
    string(4) "Sour"
    ["Colour"]=>
    string(5) "Green"
  }
}

Sweet:
array(4) {
  ["_id"]=>
  object(MongoId)#7 (1) {
    ["$id"]=>
    string(24) "50a87dd084f045a19b220dd6"
  }
  ["Name"]=>
  string(5) "Apple"
  ["Type"]=>
  string(5) "Fruit"
  ["Details"]=>
  array(2) {
    ["Taste"]=>
    string(5) "Sweet"
    ["Colour"]=>
    string(3) "Red"
  }
}

更多关于游标如何使用的信息,参见 MongoCursor

Example #2 MongoCollection::find() 例子

这个例子演示了如何搜索一个范围。

<?php

$m 
= new MongoClient();
$db $m->selectDB('test');
$collection = new MongoCollection($db'phpmanual');

// search for documents where 5 < x < 20
$rangeQuery = array('x' => array( '$gt' => 5'$lt' => 20 ));

$cursor $collection->find($rangeQuery);
foreach (
$cursor as $doc) {
    
var_dump($doc);
}

?>

以上例程会输出:

array(2) {
  ["_id"]=>
  object(MongoId)#10 (1) {
    ["$id"]=>
    string(24) "4ebc3e3710b89f2349000000"
  }
  ["x"]=>
  int(12)
}
array(2) {
  ["_id"]=>
  object(MongoId)#11 (1) {
    ["$id"]=>
    string(24) "4ebc3e3710b89f2349000001"
  }
  ["x"]=>
  int(12)
}

更多关于游标如何使用的信息,参见 MongoCursor

Example #3 使用 $where 的 MongoCollection::find() 例子

这个例子演示了如何搜索一个集合,并用 javascript 代码来筛选结果集。

<?php

$m 
= new MongoClient();
$db $m->selectDB('test');
$collection = new MongoCollection($db'phpmanual');

$js "function() {
    return this.name == 'Joe' || this.age == 50;
}"
;
$cursor $collection->find(array('$where' => $js));
foreach (
$cursor as $doc) {
    
var_dump($doc);
}

?>

以上例程会输出:

array(3) {
  ["_id"]=>
  object(MongoId)#7 (1) {
    ["$id"]=>
    string(24) "4ebc3e3710b89f2349000002"
  }
  ["name"]=>
  string(3) "Joe"
  ["age"]=>
  int(20)
}

Example #4 使用 $in 的 MongoCollection::find() 例子

这个例子演示了使用 $in 操作符来搜索集合。

<?php

$m 
= new MongoClient();
$db $m->selectDB('test');
$collection = new MongoCollection($db'phpmanual');

$cursor $collection->find(array(
    
'name' => array('$in' => array('Joe''Wendy'))
));

?>

以上例程会输出:

array(3) {
  ["_id"]=>
  object(MongoId)#7 (1) {
    ["$id"]=>
    string(24) "4ebc3e3710b89f2349000002"
  }
  ["name"]=>
  string(3) "Joe"
  ["age"]=>
  int(20)
}

Example #5 以数组形式获取结果集

返回 MongoCursor。 常常在开始的时候,人们更习惯使用数组。 使用 iterator_to_array() 将游标转换成一个数组。

<?php

$m 
= new MongoClient();
$db $m->selectDB('test');
$collection = new MongoCollection($db'phpmanual');

$cursor $collection->find();
$array iterator_to_array($cursor);

?>

以上例程会输出:

array(3) {
  ["4ebc40af10b89f5149000000"]=>
  array(2) {
    ["_id"]=>
    object(MongoId)#6 (1) {
      ["$id"]=>
      string(24) "4ebc40af10b89f5149000000"
    }
    ["x"]=>
    int(12)
  }
  ["4ebc40af10b89f5149000001"]=>
  array(2) {
    ["_id"]=>
    object(MongoId)#11 (1) {
      ["$id"]=>
      string(24) "4ebc40af10b89f5149000001"
    }
    ["x"]=>
    int(12)
  }
  ["4ebc40af10b89f5149000002"]=>
  array(3) {
    ["_id"]=>
    object(MongoId)#12 (1) {
      ["$id"]=>
      string(24) "4ebc40af10b89f5149000002"
    }
    ["name"]=>
    string(3) "Joe"
    ["age"]=>
    int(20)
  }
}

使用 iterator_to_array() 会让驱动将强制载入所有搜索结果集到内存,所以对超过内存大小的结果集不要这么做!

同时,有些系统集合不具有 _id 字段。 如果你处理一个可能没有 _id 字段的集合,需要将 FALSE 传入 iterator_to_array() 第二个参数(这样它不会尝试使用不存在的 _id 的值作为数组键)。

参见