1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-25 16:02:13 +01:00
Files
archived-doc-es/reference/mongo/types.xml
Pedro Antonio Gil Rodríguez 48db252cf2 Actualización a la última versión
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@334831 c90b9560-bf6c-de11-be94-00142212c4b1
2014-09-10 08:34:08 +00:00

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>