new: mongocollection + mongo

git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@347236 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
sergey
2019-04-16 04:23:08 +00:00
parent 832b39cb93
commit de36369f6d
4 changed files with 1356 additions and 0 deletions

View File

@ -0,0 +1,583 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 0d871eae6ef2187b9b89c16109afc4697ab6fa12 Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="mongocollection.aggregate" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>MongoCollection::aggregate</refname>
<refpurpose>Выполняет агрегацию с использованием структуры агрегации</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>array</type><methodname>MongoCollection::aggregate</methodname>
<methodparam><type>array</type><parameter>pipeline</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>options</parameter></methodparam>
</methodsynopsis>
<methodsynopsis>
<modifier>public</modifier> <type>array</type><methodname>MongoCollection::aggregate</methodname>
<methodparam><type>array</type><parameter>op</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>op</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>...</parameter></methodparam>
</methodsynopsis>
<para>
<link xlink:href="&url.mongodb.docs.aggregation;">Платформа агрегации</link> MongoDB
предоставляет средства для вычисления агрегированных значений без использования MapReduce.
Несмотря на то, что MapReduce является мощным средством, оно зачастую сложнее,
чем необходимо для многих простых задач агрегирования, таких как суммирование
или вычисление среднего значения полей.
</para>
<para>
Метод принимает либо переменное количество операторов конвейера,
либо один массив операторов, составляющих конвейер.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>pipeline</parameter></term>
<listitem>
<para>
Массив операторов конвейера.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>options</parameter></term>
<listitem>
<para>Опции для команды агрегации. Допустимые варианты:</para>
<itemizedlist>
<listitem>
<para><literal>"allowDiskUse"</literal></para>
<para>Разрешить этапы агрегации для записи во временные файлы</para>
</listitem>
<listitem>
<para><literal>"cursor"</literal></para>
<para>
Опции, управляющие созданием объекта курсора.
Эта опция заставляет команду возвращать результат документа,
подходящий для создания <classname>MongoCommandCursor</classname>.
Если вам нужно использовать эту опцию,
вы должны рассмотреть возможность
использования <methodname>MongoCollection::aggregateCursor</methodname>.
</para>
</listitem>
<listitem>
<para><literal>"explain"</literal></para>
<para>Вернуть информацию об обработке конвейера.</para>
</listitem>
&mongo.command.parameters.maxtimems;
</itemizedlist>
</listitem>
</varlistentry>
</variablelist>
<para>Or</para>
<variablelist>
<varlistentry>
<term><parameter>op</parameter></term>
<listitem>
<para>
Первый оператор конвейера.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>op</parameter></term>
<listitem>
<para>
Второй оператор конвейера.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>...</parameter></term>
<listitem>
<para>
Дополнительные операторы конвейера.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Результат агрегации в виде массива. <varname>ok</varname> будет
установлен в качестве <literal>1</literal> в случае успеха,
<literal>0</literal> в случае ошибки.
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
При возникновении ошибки возвращается массив со следующими ключами:
<itemizedlist>
<listitem>
<simpara>
<varname>errmsg</varname> - с указанием причины отказа
</simpara>
</listitem>
<listitem>
<simpara>
<varname>code</varname> - код ошибки сбоя
</simpara>
</listitem>
<listitem>
<simpara>
<varname>ok</varname> - будет установлен 0.
</simpara>
</listitem>
</itemizedlist>
</para>
</refsect1>
<refsect1 role="changelog"><!-- {{{ -->
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>1.5.0</entry>
<entry>
Добавлен необязательный аргумент <parameter>options</parameter>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1><!-- }}} -->
<refsect1 role="examples">
&reftitle.examples;
<example xml:id="mongocollection.aggregate.example.basic">
<title>Пример использования <methodname>MongoCollection::aggregate</methodname></title>
<para>
В следующем примере операция агрегирования поворачивает данные,
чтобы создать набор имен авторов, сгруппированных по тегам,
примененным к статье. Вызовите структуру агрегации, введя следующую команду:
</para>
<programlisting role="php">
<![CDATA[
<?php
$m = new MongoClient("localhost");
$c = $m->selectDB("examples")->selectCollection("article");
$data = array (
'title' => 'this is my title',
'author' => 'bob',
'posted' => new MongoDate,
'pageViews' => 5,
'tags' => array ( 'fun', 'good', 'fun' ),
'comments' => array (
array (
'author' => 'joe',
'text' => 'this is cool',
),
array (
'author' => 'sam',
'text' => 'this is bad',
),
),
'other' =>array (
'foo' => 5,
),
);
$d = $c->insert($data, array("w" => 1));
$ops = array(
array(
'$project' => array(
"author" => 1,
"tags" => 1,
)
),
array('$unwind' => '$tags'),
array(
'$group' => array(
"_id" => array("tags" => '$tags'),
"authors" => array('$addToSet' => '$author'),
),
),
);
$results = $c->aggregate($ops);
var_dump($results);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(2) {
["result"]=>
array(2) {
[0]=>
array(2) {
["_id"]=>
array(1) {
["tags"]=>
string(4) "good"
}
["authors"]=>
array(1) {
[0]=>
string(3) "bob"
}
}
[1]=>
array(2) {
["_id"]=>
array(1) {
["tags"]=>
string(3) "fun"
}
["authors"]=>
array(1) {
[0]=>
string(3) "bob"
}
}
}
["ok"]=>
float(1)
}
]]>
</screen>
</example>
<para>
В следующих примерах используется
<link xlink:href="&url.mongodb.examples.zipcode;">набор данных zipcode</link>.
Используйте mongoimport для загрузки этого набора данных в ваш экземпляр mongod.
</para>
<example xml:id="mongocollection.aggregate.example.zipcode.population">
<title>Пример использования <methodname>MongoCollection::aggregate</methodname></title>
<para>
Чтобы вернуть все штаты с населением более 10 миллионов, используйте следующую операцию агрегирования:
</para>
<programlisting role="php">
<![CDATA[
<?php
$m = new MongoClient("localhost");
$c = $m->selectDB("test")->selectCollection("zips");
$pipeline = array(
array(
'$group' => array(
'_id' => array('state' => '$state'),
'totalPop' => array('$sum' => '$pop')
)
),
array(
'$match' => array(
'totalPop' => array('$gte' => 10 * 1000 * 1000)
)
),
);
$out = $c->aggregate($pipeline);
var_dump($out);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(2) {
["result"]=>
array(7) {
[0]=>
array(2) {
["_id"]=>
string(2) "TX"
["totalPop"]=>
int(16986510)
}
[1]=>
array(2) {
["_id"]=>
string(2) "PA"
["totalPop"]=>
int(11881643)
}
[2]=>
array(2) {
["_id"]=>
string(2) "NY"
["totalPop"]=>
int(17990455)
}
[3]=>
array(2) {
["_id"]=>
string(2) "IL"
["totalPop"]=>
int(11430602)
}
[4]=>
array(2) {
["_id"]=>
string(2) "CA"
["totalPop"]=>
int(29760021)
}
[5]=>
array(2) {
["_id"]=>
string(2) "OH"
["totalPop"]=>
int(10847115)
}
[6]=>
array(2) {
["_id"]=>
string(2) "FL"
["totalPop"]=>
int(12937926)
}
}
["ok"]=>
float(1)
}
]]>
</screen>
</example>
<example xml:id="mongocollection.aggregate.example.zipcode.population.average">
<title>Пример использования <methodname>MongoCollection::aggregate</methodname></title>
<para>
Чтобы получить среднюю численность населения по городам в каждом штате, используйте следующую операцию агрегирования:
</para>
<programlisting role="php">
<![CDATA[
<?php
$m = new MongoClient;
$c = $m->selectDB("test")->selectCollection("zips");
$out = $c->aggregate(
array(
'$group' => array(
'_id' => array('state' => '$state', 'city' => '$city' ),
'pop' => array('$sum' => '$pop' )
)
),
array(
'$group' => array(
'_id' => '$_id.state',
'avgCityPop' => array('$avg' => '$pop')
)
)
);
var_dump($out);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(2) {
["result"]=>
array(51) {
[0]=>
array(2) {
["_id"]=>
string(2) "DC"
["avgCityPop"]=>
float(303450)
}
[1]=>
array(2) {
["_id"]=>
string(2) "DE"
["avgCityPop"]=>
float(14481.913043478)
}
...
[49]=>
array(2) {
["_id"]=>
string(2) "WI"
["avgCityPop"]=>
float(7323.0074850299)
}
[50]=>
array(2) {
["_id"]=>
string(2) "WV"
["avgCityPop"]=>
float(2759.1953846154)
}
}
["ok"]=>
float(1)
}
]]>
</screen>
</example>
<example xml:id="mongocollection.aggregate.example.zipcode.explain">
<title><methodname>MongoCollection::aggregate</methodname>с параметрами команды</title>
<para>
Чтобы вернуть информацию о том, как будет обрабатываться конвейер,
мы используем опцию команды <literal>explain</literal>:
</para>
<programlisting role="php">
<![CDATA[
<?php
$m = new MongoClient;
$c = $m->selectDB("test")->selectCollection("zips");
$pipeline = array(
array(
'$group' => array(
'_id' => '$state',
'totalPop' => array('$sum' => '$pop'),
),
),
array(
'$match' => array(
'totalPop' => array('$gte' => 10 * 1000 * 1000)
)
),
array(
'$sort' => array("totalPop" => -1),
),
);
$options = array("explain" => true);
$out = $c->aggregate($pipeline, $options);
var_dump($out);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(2) {
["stages"]=>
array(4) {
[0]=>
array(1) {
["$cursor"]=>
array(3) {
["query"]=>
array(0) {
}
["fields"]=>
array(3) {
["pop"]=>
int(1)
["state"]=>
int(1)
["_id"]=>
int(0)
}
["plan"]=>
array(4) {
["cursor"]=>
string(11) "BasicCursor"
["isMultiKey"]=>
bool(false)
["scanAndOrder"]=>
bool(false)
["allPlans"]=>
array(1) {
[0]=>
array(3) {
["cursor"]=>
string(11) "BasicCursor"
["isMultiKey"]=>
bool(false)
["scanAndOrder"]=>
bool(false)
}
}
}
}
}
[1]=>
array(1) {
["$group"]=>
array(2) {
["_id"]=>
string(6) "$state"
["totalPop"]=>
array(1) {
["$sum"]=>
string(4) "$pop"
}
}
}
[2]=>
array(1) {
["$match"]=>
array(1) {
["totalPop"]=>
array(1) {
["$gte"]=>
int(10000000)
}
}
}
[3]=>
array(1) {
["$sort"]=>
array(1) {
["sortKey"]=>
array(1) {
["totalPop"]=>
int(-1)
}
}
}
}
["ok"]=>
float(1)
}
]]>
</screen>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><methodname>MongoCollection::aggregateCursor</methodname></member>
<member><link xlink:href="&url.mongodb.docs.aggregation;">Структуры агрегации</link> MongoDB</member>
</simplelist>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: efc16a7a338ad0002b4ed2ed660ea682dfd22ef4 Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="mongocollection.construct" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>MongoCollection::__construct</refname>
<refpurpose>Создает новую коллекцию</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <methodname>MongoCollection::__construct</methodname>
<methodparam><type>MongoDB</type><parameter>db</parameter></methodparam>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
</methodsynopsis>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term>
<type>MongoDB</type>
<parameter>db</parameter>
</term>
<listitem>
<para>
Родительская база данных.
</para>
</listitem>
</varlistentry>
</variablelist>
<variablelist>
<varlistentry>
<term>
<parameter>name</parameter>
</term>
<listitem>
<para>
Название для этой коллекции.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Возвращает новый объект коллекции.
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
Выдает исключение по умолчанию, если имя коллекции недопустимо.
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 88fb3e60e4165df620d3c8ead7111db54d38f8cd Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="mongocollection.createdbref" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>MongoCollection::createDBRef</refname>
<refpurpose>Создает ссылку на базу данных</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>array</type><methodname>MongoCollection::createDBRef</methodname>
<methodparam><type>mixed</type><parameter>document_or_id</parameter></methodparam>
</methodsynopsis>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term>
<parameter>document_or_id</parameter>
</term>
<listitem>
<para>
Если указан массив или объект, его поле <literal>_id</literal>
будет использоваться в качестве идентификатора ссылки.
Если указан <classname>MongoId</classname> или скаляр,
он будет использоваться в качестве ссылочного идентификатора.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Возвращает массив ссылок на базу данных.
</para>
<para>
Если в качестве параметра <literal>document_or_id</literal>
был указан массив без поля <literal>_id</literal>,
будет возвращено значение &null;.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>Пример использования <methodname>MongoCollection::createDBRef</methodname></title>
<programlisting role="php">
<![CDATA[
<?php
$songs = $db->songs;
$playlists = $db->playlists;
// создаем ссылку на песню
$manamana = $songs->findOne(array('title' => 'Ma na ma na'));
$refToSong = $songs->createDBRef($manamana);
// добавляем ссылку в мой плейлист
$playlists->update(array('username' => 'me'), array('$push' => array('songlist' => $refToSong)));
?>
]]>
</programlisting>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><methodname>MongoCollection::getDBRef</methodname></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@ -0,0 +1,583 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: b2357fc62a4d09fa67bb7f4f022ddb68091d61c0 Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="mongo.tutorial" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Руководство</title>
<warning>
&mongo.deprecated.note;
</warning>
<para>
Это официальный драйвер MongoDB для PHP.
</para>
<para>
Вот быстрый пример кода, который соединяется с MongoDB, вставляет и запрашивает документы,
выполняет итерацию результатов запроса и отключается.
Подробнее о каждом шаге в руководстве ниже.
</para>
<example xml:id="mongo.tutorial.basics">
<programlisting role="php">
<![CDATA[
<?php
// соединяемся
$m = new MongoClient();
// выбираем базу данных
$db = $m->comedy;
// выбираем коллекцию (аналог таблицы реляционной базы данных)
$collection = $db->cartoons;
// добавляем запись
$document = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($document);
// добавляем еще одну запись, с другой "формой"
$document = array( "title" => "XKCD", "online" => true );
$collection->insert($document);
// находим все в коллекции
$cursor = $collection->find();
// перебираем результаты
foreach ($cursor as $document) {
echo $document["title"] . "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Calvin and Hobbes
XKCD
]]>
</screen>
</example>
<section xml:id="mongo.tutorial.connecting">
<title>Создание соединения</title>
<para>
Чтобы подключиться к серверу базы данных, используйте одну из следующих конструкций:
</para>
<example xml:id="mongo.tutorial.connecting-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient(); // подключаемся к localhost:27017
$connection = new MongoClient( "mongodb://example.com" ); // подключиться к удаленному хосту (порт по умолчанию: 27017)
$connection = new MongoClient( "mongodb://example.com:65432" ); // подключиться к удаленному хосту по заданному порту
?>
]]>
</programlisting>
</example>
<para>
Вам не нужно явно отключаться от базы данных.
Драйвер использует постоянные соединения и будет повторно использовать уже установленные соединения.
</para>
<section xml:id="mongo.tutorial.connecting.seealso">
<title>Смотрите также</title>
<para>
Глава о <link linkend="mongo.connecting">подключении</link>,
охватывающая различные типы соединений.
</para>
<para>
Документация по API для класса <classname>MongoClient</classname>
и <function>MongoClient::__construct</function> дает исчерпывающий
обзор всех возможных вариантов с несколькими примерами.
</para>
</section>
</section>
<section xml:id="mongo.tutorial.selectdb">
<title>Получение базы данных</title>
<para>
Чтобы выбрать базу данных, используйте:
</para>
<example xml:id="mongo.tutorial.selectdb-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$db = $connection->dbname;
?>
]]>
</programlisting>
</example>
<para>
База данных не обязательно должна быть создана заранее,
вы можете создать новые базы данных, просто выбрав их.
</para>
<para>
Будьте осторожны с опечатками!
Вы можете непреднамеренно создать новую базу данных,
что может привести к сбивающим с толку ошибкам
(ниже приведен код, когда используется <literal>name</literal>
и неправильно введенное <literal>anme</literal> во втором случае:
<example xml:id="mongo.tutorial.selectdb.typo">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$db = $connection->mybiglongdbname;
// делаем что-нибудь
$db = $connection->mybiglongdbanme;
// сейчас мы подключены к другой базе данных!
?>
]]>
</programlisting>
</example>
</para>
<section xml:id="mongo.tutorial.selectdb.seealso">
<title>Смотрите также</title>
<para>
Документация по API для класса <classname>MongoDB</classname>
содержит больше информации об объектах базы данных.
</para>
</section>
</section>
<section xml:id="mongo.tutorial.collection">
<title>Получение коллекции</title>
<para>
Получение коллекции имеет тот же синтаксис, что и получение базы данных:
</para>
<example xml:id="mongo.tutorial.collection-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$db = $connection->baz;
// выбираем коллекцию:
$collection = $db->foobar;
// или, непосредственно выбирем базу данных и коллекцию:
$collection = $connection->baz->foobar;
?>
]]>
</programlisting>
</example>
<para>
Коллекция аналогична таблице (если вы знакомы с реляционными базами данных).
</para>
<section xml:id="mongo.tutorial.collection.seealso">
<title>Смотрите также</title>
<para>
Документация по API для класса <classname>MongoCollection</classname>
содержит больше информации об объектах коллекции.
</para>
</section>
</section>
<section xml:id="mongo.tutorial.insert">
<title>Вставка документа</title>
<para>
Ассоциативные массивы - это базовый объект,
который можно сохранить в коллекции в базе данных.
Например, "документ" может быть:
</para>
<example xml:id="mongo.tutorial.insert-data-example">
<programlisting role="php">
<![CDATA[
<?php
$doc = array(
"name" => "MongoDB",
"type" => "database",
"count" => 1,
"info" => (object)array( "x" => 203, "y" => 102),
"versions" => array("0.9.7", "0.9.8", "0.9.9")
);
?>
]]>
</programlisting>
</example>
<para>
Обратите внимание, что вы можете иметь вложенные массивы и объекты.
Драйвер всегда будет хранить ассоциативный массив как объект в базе данных.
Численно индексированный массив сохраняется как массив в случае,
если ключи начинаются с 0 и не прерываются, и как объект,
если ключи массива не начинаются с 0
или имеют пробелы (то есть: <literal>0, 1, 4, 5</literal>).
</para>
<para>
Чтобы вставить этот документ, используйте <function>MongoCollection::insert</function>:
</para>
<example xml:id="mongo.tutorial.insert-example-2">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$collection->insert( $doc );
?>
]]>
</programlisting>
</example>
<section xml:id="mongo.tutorial.insert.seealso">
<title>Смотрите также</title>
<para>
Документация API к <function>MongoCollection::insert</function>
содержит больше информации о вставке данных.
</para>
</section>
</section>
<section xml:id="mongo.tutorial.findone">
<title>
Поиск документов с помощью <function>MongoCollection::findOne</function>
</title>
<para>
Чтобы показать, что документ, который мы вставили на предыдущем шаге,
хранится в базе данных, мы можем выполнить простую
операцию <function>MongoCollection::findOne</function>,
чтобы получить один документ из коллекции.
Этот метод полезен, когда существует только один документ,
соответствующий запросу, или вас интересует только один результат.
</para>
<example xml:id="mongo.tutorial.findone-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$document = $collection->findOne();
var_dump( $document );
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(6) {
["_id"]=>
object(MongoId)#8 (1) {
["$id"]=>
string(24) "4e2995576803fab768000000"
}
["name"]=>
string(7) "MongoDB"
["type"]=>
string(8) "database"
["count"]=>
int(1)
["info"]=>
array(2) {
["x"]=>
int(203)
["y"]=>
int(102)
}
["versions"]=>
array(3) {
[0]=>
string(5) "0.9.7"
[1]=>
string(5) "0.9.8"
[2]=>
string(5) "0.9.9"
}
}
]]>
</screen>
</example>
<para>
Обратите внимание, что есть поле <literal>_id</literal>,
которое было автоматически добавлено в ваш документ. <literal>_id</literal> - это поле
"первичный ключ". Если в вашем документе он не указан, драйвер добавит его автоматически.
</para>
<para>
Если вы укажете свое собственное поле <literal>_id</literal>,
оно должно быть уникальным для коллекции. Смотрите пример здесь:
</para>
<example xml:id="mongo.tutorial.findone-example-2">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$db = $connection->database;
$db->foo->insert(array("_id" => 1));
// это выдаст исключение
$db->foo->insert(array("_id" => 1));
// здесь все хорошо, так как это другая коллекция
$db->bar->insert(array("_id" => 1));
?>
]]>
</programlisting>
</example>
<para>
По умолчанию драйвер гарантирует, что сервер подтвердил запись перед возвратом.
Вы можете при желании отключить это поведение,
передав <literal>array("w" => 0)</literal> в качестве второго аргумента.
Это означает, что драйвер не должен ждать,
пока база данных подтвердит запись,
и не вызовет исключение дубликата <literal>_id</literal>.
</para>
<section xml:id="mongo.tutorial.findone.seealso">
<title>Смотрите также</title>
<para>
<function>MongoCollection::findOne</function>
для получения дополнительной информации о поиске данных.
</para>
<para>
<classname>MongoId</classname> более подробно
описывает уникальные идентификаторы.
</para>
<para>
Раздел <link linkend="mongo.writes">записи</link> описывает
более детальную запись, а в главе <xref linkend="mongo.writeconcerns" />
подробно рассматриваются различные параметры записи.
</para>
</section>
</section>
<section xml:id="mongo.tutorial.insert.multiple">
<title>Добавление нескольких документов</title>
<para>
Чтобы сделать более интересные вещи с запросами, давайте добавим в коллекцию
несколько простых документов. Эти документы будут иметь
форму <literal>array( "i" => <replaceable>value</replaceable> );</literal>;
и мы можем сделать это довольно эффективно в цикле:
</para>
<example xml:id="mongo.tutorial.insert.multiple-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
for ( $i = 0; $i < 100; $i++ )
{
$collection->insert( array( 'i' => $i, "field{$i}" => $i * 2 ) );
}
?>
]]>
</programlisting>
</example>
<para>
Обратите внимание, что мы можем вставить массивы с разными ключами в одну коллекцию.
Именно этот аспект мы имеем в виду, когда говорим, что MongoDB "без схемы".
В приведенном выше примере каждый документ имеет поле <literal>i</literal>,
а также имя поля в виде <literal>field</literal> + <literal>$i</literal>.
</para>
</section>
<section xml:id="mongo.tutorial.counting">
<title>Подсчет документов в коллекции</title>
<para>
Теперь, когда мы вставили 101 документ (100, которые мы сделали в цикле, плюс первый),
мы можем проверить, добавлены ли они все, используя метод <function>MongoCollection::count</function>.
<example xml:id="mongo.tutorial.counting-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
echo $collection->count();
?>
]]>
</programlisting>
</example>
и это должно вывести 101.
</para>
</section>
<section xml:id="mongo.tutorial.cursor">
<title>Использование курсора для получения всех документов</title>
<para>
Чтобы получить все документы в коллекции, мы будем
использовать <function>MongoCollection::find</function>.
Метод find() возвращает объект <classname>MongoCursor</classname>,
который позволяет перебирать набор документов, соответствующих нашему запросу.
Итак, чтобы запросить все документы и распечатать их:
<example xml:id="mongo.tutorial.cursor-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$cursor = $collection->find();
foreach ( $cursor as $id => $value )
{
echo "$id: ";
var_dump( $value );
}
?>
]]>
</programlisting>
</example>
и это должно вывести все 101 документов в коллекции.
<literal>$id</literal> - это поле <literal>_id</literal> документа (приведенное к строке),
а <literal>$value</literal> - сам документ.
</para>
<section xml:id="mongo.tutorial.cursor.seealso">
<title>Смотрите также</title>
<para>
Документация API по <function>MongoCollection::find</function>
содержит больше информации о поиске данных.
</para>
</section>
</section>
<section xml:id="mongo.tutorial.criteria">
<title>Установка критериев для запроса</title>
<para>
Мы можем создать запрос для передачи в метод <function>MongoCollection::find</function>,
чтобы получить подмножество документов в нашей коллекции.
Например, если мы хотим найти документ, для которого значение
поля <literal>"i"</literal> равно <literal>71</literal>, мы бы сделали следующее:
</para>
<example xml:id="mongo.tutorial.criteria-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$query = array( 'i' => 71 );
$cursor = $collection->find( $query );
while ( $cursor->hasNext() )
{
var_dump( $cursor->getNext() );
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(2) {
["_id"]=>
object(MongoId)#6 (0) {
}
["i"]=>
int(71)
["_ns"]=>
"testCollection"
}
]]>
</screen>
</example>
</section>
<section xml:id="mongo.tutorial.multi.query">
<title>Получение набора документов с запросом</title>
<para>
Мы можем использовать запрос, чтобы получить набор документов из нашей коллекции.
Например, если мы хотим получить все документы, где <literal>"i"</literal>
&gt; <literal>50</literal>, мы могли бы написать:
</para>
<example xml:id="mongo.tutorial.multi.query-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$query = array( "i" => array( '$gt' => 50 ) ); //обратите внимание на одинарные кавычки вокруг '$gt'
$cursor = $collection->find( $query );
while ( $cursor->hasNext() )
{
var_dump( $cursor->getNext() );
}
?>
]]>
</programlisting>
<para>
который должен напечатать документы, где <literal>"i"</literal> &gt;
<literal>50</literal>.
Мы также можем получить диапазон, скажем, <literal>20 &lt; i &lt;= 30</literal>:
</para>
<screen>
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$query = array( 'i' => array( '$gt' => 20, "\$lte" => 30 ) );
$cursor = $collection->find( $query );
while ( $cursor->hasNext() )
{
var_dump( $cursor->getNext() );
}
?>
]]>
</screen>
</example>
<para>
Не забывайте всегда избегать символа $ или использовать
одинарные кавычки. В противном случае PHP будет интерпретировать его,
как переменную <varname>$gt</varname>.
</para>
</section>
<section xml:id="mongo.tutorial.indexes">
<title>Создание индекса</title>
<para>
MongoDB поддерживает индексы, и их очень легко добавить в коллекцию.
Для создания индекса вы указываете имя поля и направление:
по возрастанию (1) или по убыванию (-1).
Следующее создает восходящий индекс в поле "i":
</para>
<example xml:id="mongo.tutorial.indexes-example">
<programlisting role="php">
<![CDATA[
<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$collection->ensureIndex( array( "i" => 1 ) ); // создаем индекс на "i"
$collection->ensureIndex( array( "i" => -1, "j" => 1 ) ); // индекс на "i" по убыванию, "j" по возрастанию
?>
]]>
</programlisting>
</example>
<para>
Индексирование имеет решающее значение для хорошей производительности чтения
по мере роста ваших данных. Если вы не знакомы с индексированием,
ознакомьтесь с документацией <function>MongoCollection::ensureIndex</function>
и базовой документацией по <link xlink:href="&url.mongodb.dochub.indexes;">индексированию MongoDB</link>.
</para>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->