mirror of
https://github.com/php/doc-es.git
synced 2026-03-25 16:02:13 +01:00
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@334831 c90b9560-bf6c-de11-be94-00142212c4b1
320 lines
11 KiB
XML
320 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 565e478d69a9d0c217eda773c77ca823423adf21 Maintainer: seros Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
|
|
<part xml:id="mongo.types" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
|
|
<title>Tipos</title>
|
|
|
|
<partintro>
|
|
<section>
|
|
<para>
|
|
MongoDB permite a los programadores guardar y consultar datos expresados tanto en los
|
|
tipos básicos de PHP, los tipos compuestos (arrays, arrays asociativos, y objetos), y
|
|
en media docena de clases que proporciona el driver MongoDB de PHP (para expresiones
|
|
regulares, fechas, y otras aplicaciones especializadas).
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Booleanos y &null;</title>
|
|
<para>
|
|
&true;, &false;, y &null; pueden usarse tal cual.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Números</title>
|
|
<para>
|
|
En MongoDB los números son distintos de los strings: "123" no es lo mismo que 123.
|
|
Por tanto, si se desea asegurar de que los números se ordenan y comparan correctamente,
|
|
debe asegurarse de que realmente se almacenan como números.
|
|
</para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
$doc = array("a" => 123, "b" => "123");
|
|
$collection->insert($doc);
|
|
|
|
$doc->find(array("a" => 123)); // coincide
|
|
$doc->find(array("a" => "123")); // no coincide
|
|
$doc->find(array("a" => 123.0)); // coincide
|
|
$doc->find(array("b" => 123)); // no coincide
|
|
$doc->find(array("b" => "123")); // coincide
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
Como vemos, los números en coma flotante se comparan y coinciden con los números enteros
|
|
tal como cabría esperar.
|
|
</para>
|
|
<section>
|
|
<title>Números Largos</title>
|
|
<para>
|
|
Por omisión, en sistemas de 32 bits, los números se envían a la base de datos como
|
|
enteros de 32 bit. En sistemas 64 bits, se envían como enteros de 64 bit. Para guardar la
|
|
compatibilidad, todos los sistemas deserializan los enteros de 64 bit como números
|
|
en coma flotante. Los números en coma flotante no son exactos. Si fuera necesario usar
|
|
valores exactos, habría que hacerlo ajsutando el
|
|
<link xlink:href="mongo.configure;">fichero php.ini</link>.
|
|
</para>
|
|
<para>
|
|
En sistemas de 32 bits, si <literal>mongo.long_as_object</literal> está habilitado,
|
|
los enteros de 64 bit se devolverán como objetos <classname>MongoInt64</classname>.
|
|
El entero se almacenará en el campo <literal>value</literal>
|
|
con una precisión perfecta (como un string).
|
|
<classname>MongoInt64</classname> puede usarse también para guardar enteros de 64 bit en máquinas
|
|
de 32 bits.
|
|
</para>
|
|
<para>
|
|
En sistemas de 64 bits, puede o bien habilitarse <literal>mongo.long_as_object</literal>
|
|
o <literal>mongo.native_long</literal>.
|
|
<literal>mongo.native_long</literal> devolverá enteros de 64 bit y
|
|
enteros "normales" de PHP. <classname>MongoInt32</classname> puede usarse para
|
|
almacenar enteros de 32 bit en máquinas de 64 bits.
|
|
</para>
|
|
<para>
|
|
Debe establecerse un valor en <literal>mongo.long_as_object</literal> y en
|
|
<literal>mongo.native_long</literal> de acuerdo al comportamiento que se espere, incluso
|
|
en el caso de que coincida con los valores por omisión (para prevenir futuros cambios de estos
|
|
valores).
|
|
</para>
|
|
<para>
|
|
Vea también: <link xlink:href="mongo.configure;">Opciones de php.ini</link>,
|
|
<classname>MongoInt32</classname>, <classname>MongoInt64</classname>.
|
|
</para>
|
|
</section>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Strings</title>
|
|
<para>
|
|
Los strings deben ser UTF-8. Si no, o bien se convierten a UTF-8
|
|
antes de enviarse a la base de datos, o bien se almacenan como datos binarios.
|
|
</para>
|
|
<para>
|
|
Pueden usarse expresiones regulares para consultar strings, y se expresan usando la clase
|
|
<classname>MongoRegex</classname>.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Datos Binarios</title>
|
|
<para>
|
|
Tanto los textos que no son UTF-8, como las imágenes, o cualuier otro dato binario, debe enviarse
|
|
a la base de datos usando el tipo <classname>MongoBinData</classname>.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Fechas</title>
|
|
<para>
|
|
Pueden crearse fechas usando la clase <classname>MongoDate</classname>. Se almacenan
|
|
como milisegundos a partir de la fecha de referencia.
|
|
</para>
|
|
<para>
|
|
<classname>MongoTimestamp</classname> no es para almacenar fechas ni timestamps,
|
|
sino que se usa internamente por MongoDB. A no ser que se esté creando una herramienta que
|
|
interactúe con los entresijos de réplicas o sharding, se deberá usar
|
|
<classname>MongoDate</classname>, y <emphasis>no</emphasis>
|
|
<classname>MongoTimestamp</classname>.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Ids Únicos</title>
|
|
<para>
|
|
El driver creará automáticamente un campo <literal>_id</literal> antes de
|
|
insertar un documento (a no ser que el usuario haya especificado uno). Este campo es una instancia
|
|
de <classname>MongoId</classname> (en otros lenguajes habitualmente se le llama
|
|
"ObjectId").
|
|
</para>
|
|
<para>
|
|
Estos ids se componen de 12 bytes:
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>4 bytes de timestamp</para>
|
|
<para>
|
|
Dos registros no pueden tener el mismo id si se han insertado en momentos
|
|
diferentes.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>3 bytes de id de máquina</para>
|
|
<para>
|
|
Dos registros no pueden tener el mismo id si se han insertado en máquinas
|
|
diferentes.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>2 bytes de id de hebra</para>
|
|
<para>
|
|
Dos registros no pueden tener el mismo id si se han insertado por diferentes
|
|
hebras en la misma máquina.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>3 bytes de valor incremental</para>
|
|
<para>
|
|
Cada vez que se crea un id, un contador global se incrementa, y se usa
|
|
para el incremento del siguiente id.
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
Por tanto, dos registros no pueden tener el mismo id, a no ser que un único proceso
|
|
en una misma máquina trate de insertar 256^3 (más de 16 millones) de documentos en
|
|
un segundo, desbordando el campo de incremento.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>JavaScript</title>
|
|
<para>
|
|
MongoDB incorpora un motor JavaScript, de modo que se pueden incluir código JavaScript
|
|
en las consultas (usando la claúsula $where), enviarlo directamente a la base de datos para
|
|
ejecutarlo, y usarlo para llevar a cabo agregaciones.
|
|
</para>
|
|
<para>
|
|
Por seguridad, en <classname>MongoCode</classname> utilice el campo <literal>scope</literal>
|
|
cuando vaya a usar variables PHP en JavaScript. Cuando el código no requiera de
|
|
valores externos, se puede o bien usar <classname>MongoCode</classname> o símplemente
|
|
un string. Revise la
|
|
<link xlink:href="mongo.security;">sección de seguridad</link> para más
|
|
información sobre cómo enviar código JavaScript a la base de datos.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Arrays y Objetos</title>
|
|
|
|
<para>
|
|
También pueden guardarse arrays y objetos en la base de datos. Los arrays con clave
|
|
numérica incremental se almacenarán como arrays. En cualquier otro caso, se almacenarán
|
|
como objetos.
|
|
</para>
|
|
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
// $puntuaciones se almacenará como array
|
|
$puntuaciones = array(98, 100, 73, 85);
|
|
$collection->insert(array("puntuaciones" => $puntuaciones));
|
|
|
|
// $puntuaciones se almacenará como un objeto
|
|
$puntuaciones = array("pregunta1" => 98, "examen" => 100, "pregunta2" => 73, "final" => 85);
|
|
$collection->insert(array("puntuaciones" => $puntuaciones));
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
|
|
<para>
|
|
Si consultamos estos objetos en la consola de la base de dato, obtendremos algo similar a esto:
|
|
<programlisting role="shell">
|
|
<![CDATA[
|
|
> db.students.find()
|
|
{ "_id" : ObjectId("4b06beada9ad6390dab17c43"), "puntuaciones" : [ 98, 100, 73, 85 ] }
|
|
{ "_id" : ObjectId("4b06bebea9ad6390dab17c44"), "puntuaciones" : { "pregunta1" : 98, "examen" : 100, "pregunta2" : 73, "final" : 85 } }
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
La base de datos puede almacenar también objetos PHP arbitrarios (pese a que
|
|
se devolverán como arrays asociativos). Los campos se usan para pares clave/valor.
|
|
Por ejemplo, la entrada de un blog podría ser así:
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
// clase de la entrada de un blog
|
|
class Entrada {
|
|
|
|
var $autor;
|
|
var $contenido;
|
|
var $comentarios = array();
|
|
var $fecha;
|
|
|
|
public function __construct($autor, $contenido) {
|
|
$this->autor = $autor;
|
|
$this->contenido = $contenido;
|
|
$this->fecha = new MongoDate();
|
|
}
|
|
|
|
public function establecerTitulo($titulo) {
|
|
$this->titulo = $titulo;
|
|
}
|
|
}
|
|
|
|
// crear una entrada de blog sencilla e insertarla en base de datos
|
|
$entrada1 = new Entrada("Adam", "Esto es una entrada de un blog");
|
|
|
|
$blog->insert($entrada1);
|
|
|
|
|
|
// no hay niguna restricción del tipo usado en el campo "autor", de manera que podemos
|
|
// usarlo como un objeto anidado
|
|
$autor = array("nombre" => "Fred", "karma" => 42);
|
|
$entrada2 = new Entrada($autor, "Ésta es otra entrada de blog.");
|
|
|
|
// creamos un campo más para el título
|
|
$entrada2->establecerTitulo("Segunda Entrada");
|
|
|
|
$blog->insert($entrada2);
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
En la consola de la base de datos, lo veríamos parecido a esto:
|
|
<programlisting role="shell">
|
|
<![CDATA[
|
|
> db.blog.find()
|
|
{ "_id" : ObjectId("4b06c263edb87a281e09dad8"), "autor" : "Adam", "contenido" : "Esto es una entrada de un blog", "comentarios" : [ ], "fecha" : "Fri Nov 20 2009 11:22:59 GMT-0500 (EST)" }
|
|
{ "_id" : ObjectId("4b06c282edb87a281e09dad9"), "autor" : { "nombre" : "Fred", "karma" : 42 }, "contenido" : "Ésta es otra entrada de blog", "comentarios" : [ ], "fecha" : "Fri Nov 20 2009 11:23:30 GMT-0500 (EST)", "titulo" : "Segunda Entrada" }
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
El driver no detecta referencias cíclicas en arrays ni en objetos. Por
|
|
ejemplo, esto emitiría un error fatal:
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
$collection->insert($GLOBALS);
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<programlisting role="txt">
|
|
<![CDATA[
|
|
Fatal error: Nesting level too deep - recursive dependency?
|
|
]]>
|
|
</programlisting>
|
|
Si se necesitara insertar documentos que pudieran tener dependencias cíclicas, deberá
|
|
comprobarse a mano antes de pasarlo al driver.
|
|
</para>
|
|
</section>
|
|
</partintro>
|
|
&reference.mongo.mongoid;
|
|
&reference.mongo.mongocode;
|
|
&reference.mongo.mongodate;
|
|
&reference.mongo.mongoregex;
|
|
&reference.mongo.mongobindata;
|
|
&reference.mongo.mongoint32;
|
|
&reference.mongo.mongoint64;
|
|
&reference.mongo.mongodbref;
|
|
&reference.mongo.mongominkey;
|
|
&reference.mongo.mongomaxkey;
|
|
&reference.mongo.mongotimestamp;
|
|
|
|
</part>
|