Sunteți pe pagina 1din 25

MongoDB

Ir a la navegaciónIr a la búsqueda
Las referencias de este artículo no tienen un formato correcto. Puedes
colaborar editándolas como se indica en esta página.
También puedes avisar en su página de discusión a quien las
añadió pegando: {{subst:Aviso formato de
referencias|MongoDB}} ~~~~ Este aviso fue puesto el 16 de diciembre de 2014.

MongoDB

http://www.mongodb.org/

Información general

Modelo de desarrollo Código abierto

Desarrollador(es) MongoDB, Inc.

Lanzamiento inicial 2009

Última versión estable 4.0.2 (info)


29 de agosto de 2018 (4 meses y 7 días)

Última versión en 4.1.2 (info)


pruebas 14 de agosto de 2018 (4 meses y 22
días)

Género Base de datos, NoSQL

Programado en C++

Sistema operativo Multiplataforma

Licencia GNU AGPL v3.0 (drivers: licencia


Apache)

[editar datos en Wikidata]


MongoDB (de la palabra en inglés “humongous” que significa enorme) es un sistema
de base de datos NoSQLorientado a documentos, desarrollado bajo el concepto de código
abierto.
MongoDB forma parte de la nueva familia de sistemas de base de datos NoSQL. En lugar
de guardar los datos en tablas como se hace en las base de datos relacionales, MongoDB
guarda estructuras de datos en documentos similares a JSON con un esquema dinámico
(MongoDB utiliza una especificación llamada BSON), haciendo que la integración de los
datos en ciertas aplicaciones sea más fácil y rápida.
El desarrollo de MongoDB empezó en octubre de 2007 por la compañía de software
10gen.1 Ahora MongoDB es una base de datos lista para su uso en producción y con
muchas características (features). Esta base de datos se utiliza mucho en la industria,2
contando con implantaciones en empresas como MTV Network,3 Craiglist,4 BCI o
Foursquare.5
El código binario está disponible para los sistemas operativos Windows, Linux, OS
X y Solaris.

Índice

 1Historia
 2Concesión de licencias y soporte
 3Características principales
o 3.1Consultas Ad hoc
o 3.2Indexación
o 3.3Replicación
o 3.4Balanceo de carga
o 3.5Almacenamiento de archivos
o 3.6Agregación
o 3.7Ejecución de JavaScript del lado del servidor
 4Fragmentación (Sharding)
 5Principales problemas
o 5.1No implementa las propiedades ACID multidocumento
o 5.2Problemas de consistencia
o 5.3Bloqueo a nivel de documento
o 5.4Las escrituras no son durables ni verificables
o 5.5Problemas de escalabilidad
 6Casos de uso
 7Manipulación de datos: colecciones y documentos
 8Lenguajes de programación soportados
 9Instrumentos de MongoDB
 10Referencias
 11Bibliografía
 12Enlaces externos

Historia[editar]
El desarrollo de MongoDB empezó con la empresa de software 10gen Inc. (ahora llamada
MongoDB Inc.)1 en 2007 cuando estaban desarrollando una plataforma como
servicio (PaaS) similar al conocido Google App Engine.6 En 2009 MongoDB fue lanzado
como un producto independiente y publicado bajo la licencia de código abierto AGPL.7
En marzo de 2011, se lanzó la versión 1.4 y se consideró ya como una base de datos lista
para su uso en producción.8
Concesión de licencias y soporte[editar]
MongoDB se puede obtener de una forma gratuita bajo la licencia pública general de
Affero (AGPL) de GNU.7 Los drivers para los lenguajes de programaciónestán bajo
la licencia de Apache. Adicional a estas licencias, MongoDB Inc. ofrece una licencia
comercial para MongoDB que incluye características avanzadas (como integración
con SASL, LDAP, Kerberos,9 Simple Network Management Protocol10 y búsqueda de texto
de Rosette Linguistics Platform de Basis Technology11), herramientas de gestión,
monitorización y backup, así como soporte.12

Características principales[editar]
Lo siguiente es una breve descripción de las características principales de MongoDB:
Consultas Ad hoc[editar]
MongoDB soporta la búsqueda por campos, consultas de rangos y expresiones regulares.
Las consultas pueden devolver un campo específico del documento pero también puede
ser una función JavaScript definida por el usuario.
Indexación[editar]
Cualquier campo en un documento de MongoDB puede ser indexado, al igual que es
posible hacer índices secundarios. El concepto de índices en MongoDB es similar a los
encontrados en base de datos relacionales..
Replicación[editar]
MongoDB soporta el tipo de replicación primario-secundario. Cada grupo de primario y sus
secundarios se denomina replica set.13 El primario puede ejecutar comandos de lectura y
escritura. Los secundarios replican los datos del primario y sólo se pueden usar para
lectura o para copia de seguridad, pero no se pueden realizar escrituras. Los secundarios
tienen la habilidad de poder elegir un nuevo primario en caso de que el primario actual deje
de responder.
Balanceo de carga[editar]
MongoDB se puede escalar de forma horizontal usando el concepto de “shard”.14 El
desarrollador elige una clave de sharding, la cual determina cómo serán distribuidos los
datos de una colección. Los datos son divididos en rangos (basado en la clave de
sharding) y distribuidos a través de múltiples shard. Cada shard puede ser una réplica set.
MongoDB tiene la capacidad de ejecutarse en múltiple servidores, balanceando la carga
y/o replicando los datos para poder mantener el sistema funcionando en caso que exista
un fallo de hardware. La configuración automática es fácil de implementar bajo MongoDB y
se pueden agregar nuevas servidores a MongoDB con el sistema de base de datos
funcionando.
Almacenamiento de archivos[editar]
MongoDB puede ser utilizado como un sistema de archivos, tomando la ventaja de la
capacidad que tiene MongoDB para el balanceo de carga y la replicación de datos
utilizando múltiples servidores para el almacenamiento de archivos. Esta función se llama
GridFS15 y es más bien una implementación en los drivers, no en el servidor,16 por lo que
está incluida en los drivers oficiales que la compañía de MongoDB desarrolla. Estos drivers
exponen funciones y métodos para la manipulación de archivos y contenido a los
desarrolladores. En un sistema con múltiple servidores, los archivos pueden ser
distribuidos y replicados entre los mismos y de una forma transparente, de esta forma se
crea un sistema eficiente que maneja fallos y balanceo de carga.
Agregación[editar]
MongoDB proporciona un framework de agregación que permite realizar operaciones
similares a las que se obtienen con el comando SQL "GROUP BY". El framework de
agregación está construido como un pipeline en el que los datos van pasando a través de
diferentes etapas en los cuales estos datos son modificados, agregados, filtrados y
formateados hasta obtener el resultado deseado. Todo este procesado es capaz de utilizar
índices si existieran y se produce en memoria. Asimismo, MongoDB proporciona una
función MapReduce que puede ser utilizada para el procesamiento por lotes de datos y
operaciones de agregación.
Ejecución de JavaScript del lado del servidor[editar]
MongoDB tiene la capacidad de realizar consultas utilizando JavaScript, haciendo que
estas sean enviadas directamente a la base de datos para ser ejecutadas.

Fragmentación (Sharding)[editar]
Si estás desarrollando un servicio que se va haciendo popular o los niveles de acceso a
base de datos son cada vez más altos, empezarás a notar que tu base de datos está
siendo atacada por un tráfico creciente y tu servidor esté sufriendo por los altos niveles de
stress y te podrías ver en la necesidad de actualizar tu infraestructura para soportar la
demanda.
Aquí entra en juego el sharding, es el modo en el que hacemos nuestra base de datos
escalable. En lugar de tener una colección en una base de datos, la pondríamos en varias
bases de datos distribuidas, de modo que a la hora de consultar los datos de dicha
colección, los recuperemos como si de una única base de datos se tratase. Mongo se
encargará de averiguar de manera transparente en qué base de datos se encuentran los
datos.
Los fragmentos estarán formados por replica set, de modo que si creamos tres
fragmentos, cada uno de los cuales tiene una replica set con tres servidores, estaríamos
hablando de un total de nueve servidores.
Si hacemos consultas, estas se realizarán de manera distribuida a través de un módulo
enrutador llamado “MongoS” que mantendrá un pequeño pool de conexiones a los
distintos host. Para conocer en qué fragmento debe consultar para recuperar datos de una
colección ordenada, se utilizan rangos y shard_key, de modo que se trocea la colección en
rangos y les asigna un id (shard_key), que puede ser una parte del propio documento, y se
distribuye en los fragmentos (replica set). De modo que cuando se consulte la colección
debemos proporcionar el “shard_key”.

Principales problemas[editar]
No implementa las propiedades ACID multidocumento[editar]
MongoDB garantiza ACID dentro del mismo documento. El no implementar las
propiedades ACID genera que la base de datos no asegure la durabilidad, la integridad, la
consistencia y el aislamiento requeridos obligatoriamente en las transacciones. Es posible
que en futuras versiones esto se solucione.
Sobre la base de este punto se detallan los cuatro siguientes:
Problemas de consistencia[editar]
En versiones anteriores de la base de datos las lecturas estrictamente consistentes ven
versiones obsoletas de documentos, también pueden devolver datos incorrectos de
lecturas que nunca deberían haber ocurrido.17
Este problema se considera solucionado a partir de la versión
3.4: https://jepsen.io/analyses/mongodb-3-4-0-rc3
Bloqueo a nivel de documento[editar]
MongoDB bloquea la base de datos a nivel de documento ante cada operación de
escritura. Sólo se podrán hacer operaciones de escritura concurrentes entre distintos
documentos.
Las escrituras no son durables ni verificables[editar]
MongoDB retorna cuando todavía no se ha escrito la información en el espacio de
almacenamiento permanente, lo que puede ocasionar pérdidas de información. En
MongoDB 2.2 se cambia el valor por defecto para escribir en al menos una réplica, pero
esto sigue sin satisfacer la durabilidad ni la verificabilidad.18
Problemas de escalabilidad[editar]
Tiene problemas de rendimiento cuando el volumen de datos supera los 100TB.19

Casos de uso[editar]
La base de datos MongoDB es adecuada para los siguientes usos:20

 Almacenamiento y registro de eventos


 Para sistemas de manejo de documentos y contenido
 Comercio Electrónico
 Juegos
 Problemas de alto volumen de lecturas
 Aplicaciones móviles
 Almacén de datos operacional de una página web
 Manejo de contenido
 Almacenamiento de comentarios

 Votaciones
 Registro de usuarios
 Perfiles de usuarios
 Sesiones de datos
 etc.

 Proyectos que utilizan metodologías de desarrollo iterativo o ágiles


 Manejo de estadísticas en tiempo real
MongoDB es utilizado para uno o varios de estos casos por varias empresas.21

Manipulación de datos: colecciones y documentos[editar]


MongoDB guarda la estructura de los datos en documentos tipo JSON con un
esquema dinámico llamado BSON, lo que implica que no existe un esquema
predefinido. Los elementos de los datos se denominan documentos y se guardan en
colecciones. Una colección puede tener un número indeterminado de documentos.
Comparando con una base de datos relacional, se puede decir que las colecciones
son como tablas y los documentos son registros en la tabla. La diferencia es que en
una base de datos relacional cada registro en una tabla tiene la misma cantidad de
campos, mientras que en MongoDB cada documento en una colección puede tener
diferentes campos. En un documento, se pueden agregar, eliminar, modificar o
renombrar nuevos campos en cualquier momento,22 ya que no hay un esquema
predefinido. La estructura de un documento es simple y compuesta por pares
llave/valor, parecido a las matrices asociativas en un lenguaje de programación, esto
es debido a que MongoDB sigue el formato de JSON. En MongoDB la clave es el
nombre del campo y el valor es su contenido, los cuales se separan mediante el uso
de “:”, tal y como se puede ver en el siguiente ejemplo. Como valor se pueden usar
números, cadenas o datos binarios como imágenes o cualquier otro.

{
"_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
"Last Name": "PELLERIN",
"First Name": "Franck",
"Age": 29,
"Address": {
"Street": "1 chemin des Loges",
"City": "VERSAILLES"
}
}

En este ejemplo se puede ver que en el campo “Address” se contiene otro documento
que tiene los campos de “Street” y “City”.

Lenguajes de programación soportados[editar]


MongoDB tiene drivers oficiales para los siguientes lenguajes de programación:

 C
 C++
 C# / .NET
 Erlang
 Haskell
 J#
 Java
 JavaScript
 Lisp
 Node.js
 Perl
 PHP
 Python
 Ruby
 Delphi
 Scala

Instrumentos de MongoDB[editar]
Los siguientes comandos pueden ser instalados para el manejo y la administración del
sistema de base de datos:

 mongo:23 es un Shell interactivo que permite a los desarrolladores y


administradores ver, insertar, eliminar y actualizar datos en su base de datos. Este
también permite entre otras funciones la replicación de datos, configuración de
sharding, apagar los servidores, ejecutar JavaScript y todos los comandos que se
puedan realizar.
 mongostat:24 es un instrumento de línea de comandos que muestra en resumen
una lista de estadísticas de una instancia de MongoDB en ejecución. Esto te
permite visualizar cuantas inserciones, actualizaciones, eliminaciones, consultas y
comandos se han ejecutado, pero también cuanta memoria está utilizando y
cuanto tiempo ha estado cerrada la base de datos.
 mongotop:25 es un instrumento de línea de comandos que provee un método para
dar seguimiento a la cantidad de tiempo que dura una lectura o escritura de datos
en una instancia. También provee estadísticas en el nivel de cada colección.
 mongosniff:26 es un instrumento de línea de comandos que provee un sniffing en la
base de datos haciendo un sniffing en el tráfico de la red que va desde y hacia
MongoDB.
 mongoimport/mongoexport:2728 es un instrumento de línea de comandos que
facilita la importación exportación de contenido desde JSON, CSV o TSV.
También tiene el potencial de importar o exportar hacia otros formatos.
 mongodump/mongorestore:29 es un instrumento de línea de comandos para la
creación de una imagen binaria del contenido de la base de datos. Estos
comandos son utilizados para la estrategia de copias de seguridad en MongoDB.

+´´+´+´+´+´+´+

Node.js
Ir a la navegaciónIr a la búsqueda

Node.js

nodejs.org

Información general

Desarrollador(es) Node.js Foundation

Autor(es) Ryan Lienhart Dahl

Lanzamiento 27 de mayo de 2009


inicial

Última versión 10.13.0 y 8.12.0


estable 10 de octubre de 2018 (2 meses y 26 días)2 y 11
de septiembre de 2018 (3 meses y 24 días)3
Género Dirigida por eventos

Programado en C++, JavaScript

Sistema Windows, Mac OS


operativo X, Linux, Solaris, FreeBSD, OpenBSD, webOS

Licencia Licencia MIT

Estado actual Activo

Versiones

lista versiones

[editar datos en Wikidata]

Node.js es un entorno en tiempo de ejecución multiplataforma, de código abierto, para la


capa del servidor (pero no limitándose a ello) basado en el lenguaje de
programación ECMAScript, asíncrono, con I/O de datos en una arquitectura orientada a
eventos y basado en el motor V8 de Google. Fue creado con el enfoque de ser útil en la
creación de programas de red altamente escalables, como por ejemplo, servidores web.4
Fue creado por Ryan Dahl en 2009 y su evolución está apadrinada por la empresa Joyent,
que además tiene contratado a Dahl en plantilla.5 6
Node.js es similar en su propósito a Twisted o Tornado de Python, Perl Object
Environment de Perl, libevent o libev de C, EventMachine de Ruby, vibe.d de D y Java
EE de Java existe Apache MINA, Netty, Akka, Vert.x, Grizzly o Xsocket. Al contrario que la
mayoría del código JavaScript, no se ejecuta en un navegador, sino en el servidor. Node.js
implementa algunas especificaciones de CommonJS.7 Node.js incluye un
entorno REPL para depuración interactiva.

Índice

 1Ejemplos
 2Aspectos técnicos
o 2.1Concurrencia
o 2.2V8
o 2.3Módulos
o 2.4Desarrollo homogéneo entre cliente y servidor
o 2.5Bucle de eventos
 3Releases
 4Comunidad
 5Véase también
 6Referencias
 7Enlaces externos

Ejemplos[editar]
Versión de un hola mundo de un servidor HTTP escrito en Node.js:

const http = require('http');

const hostname = '127.0.0.1';


const port = 1337;

http.createServer((req, res) => {


res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

Otro ejemplo con un servidor TCP que escucha en el puerto 7000 y responde con
cualquier cosa que se le envíe:

var net = require('net');

net.createServer(function (stream) {
stream.write('hello\r\n');

stream.on('end', function () {
stream.end('goodbye\r\n');
});

stream.pipe(stream);
}).listen(7000);

Aspectos técnicos[editar]
Concurrencia[editar]
Node.js funciona con un modelo de evaluación de un único hilo de ejecución, usando
entradas y salidas asíncronas las cuales pueden ejecutarse concurrentemente en un
número de hasta cientos de miles sin incurrir en costos asociados al cambio de contexto.8
Este diseño de compartir un único hilo de ejecución entre todas las solicitudes atiende a
necesidades de aplicaciones altamente concurrentes, en el que toda operación que realice
entradas y salidas debe tener una función callback. Un inconveniente de este enfoque de
único hilo de ejecución es que Node.js requiere de módulos adicionales como cluster9 para
escalar la aplicación con el número de núcleos de procesamiento de la máquina en la que
se ejecuta.
V8[editar]
V8 es el entorno de ejecución para JavaScript creado para Google Chrome. Es software
libre desde 2008, está escrito en C++ y compila el código fuente JavaScript en código de
máquina en lugar de interpretarlo en tiempo real.
Node.js contiene libuv para manejar eventos asíncronos. Libuv es una capa de abstracción
de funcionalidades de redes y sistemas de archivo en sistemas Windows y sistemas
basados en POSIX como Linux, Mac OS X y Unix.
El cuerpo de operaciones de base de Node.js está escrito en JavaScript con métodos de
soporte escritos en C++.
Módulos[editar]
Node.js incorpora varios "módulos básicos" compilados en el propio binario, como por
ejemplo el módulo de red, que proporciona una capa para programación de red asíncrona
y otros módulos fundamentales, como por ejemplo Path, FileSystem, Buffer, Timers y el de
propósito más general Stream. Es posible utilizar módulos desarrollados por terceros, ya
sea como archivos ".node" precompilados, o como archivos en javascript plano. Los
módulos Javascript se implementan siguiendo la especificación CommonJS para
módulos,10 utilizando una variable de exportación para dar a estos scripts acceso a
funciones y variables implementadas por los módulos.11
Los módulos de terceros pueden extender node.js o añadir un nivel de abstracción,
implementando varias utilidades middleware para utilizar en aplicaciones web, como por
ejemplo los frameworks connect y express. Pese a que los módulos pueden instalarse
como archivos simples, normalmente se instalan utilizando el Node Package Manager
(npm) que nos facilitará la compilación, instalación y actualización de módulos así como la
gestión de las dependencias. Además, los módulos que no se instalen el directorio por
defecto de módulos de Node necesitarán la utilización de una ruta relativa para poder
encontrarlos. El wiki Node.jsproporciona una lista de varios de los módulos de terceros
disponibles.
Desarrollo homogéneo entre cliente y servidor[editar]
Node.js puede ser combinado con una base de datos documental (por
ejemplo, MongoDB o CouchDB) y JSON lo que permite desarrollar en un entorno de
desarrollo JavaScript unificado. Con la adaptación de los patrones para desarrollo del lado
del servidor tales como MVC y sus variantes MVP, MVVM, etc. Node.js facilita
la reutilización de código del mismo modelo de interfaz entre el lado del cliente y el lado del
servidor.
Bucle de eventos[editar]
Node.js se registra con el sistema operativo y cada vez que un cliente establece una
conexión se ejecuta un callback. Dentro del entorno de ejecución de Node.js, cada
conexión recibe una pequeña asignación de espacio de memoria dinámico, sin tener que
crear un hilo de ejecución.12 A diferencia de otros servidores dirigidos por eventos, el bucle
de gestión de eventos de Node.js no es llamado explícitamente sino que se activa al final
de cada ejecución de una función callback. El bucle de gestión de eventos se termina
cuando ya no quedan eventos por atender.

Releases[editar]
Las nuevas releases major de Node.js se sacan de la rama master de GitHub cada seis
meses. Las versiones pares se sacan en abril, y las impares en octubre. Cuando se libera
una versión impar, la versión par anterior pasa a soporte a largo plazo (Long Term
Support, LTS), que da a la versión un soporte activo de 18 meses desde la fecha de inicio
de la LTS. Después de estos 18 meses, la versión recibe otros 12 meses de soporte de
mantenimiento. Una versión activa recibirá los cambios compatibles unas pocas semanas
después de que aterricen en la versión estable actual. Una versión de mantenimiendo
recibirá sólo actualizaciones críticas y de documentación.13
La estrategia y política de las versiones LTS se gestiona por el LTS Working Group en
colaboración con el Technical Steering Committee de Node.js Foundation.

Fecha Inicio Inicio Fin


Release Nombre Estado LTS
release LTS mantenimiento mantenimiento

2013-
v0.10.x Sin soporte - 2015-10-01 2016-10-31
03-11

2015-
v0.12.x Sin soporte - 2016-04-01 2016-12-31
02-06

2015- 2015-
4.x Argon Sin soporte 2017-04-01 2018-04-30
09-08 10-01

2015-
5.x No LTS N/D 2016-06-30
10-29

2016- 2016-
6.x Boron13 Mantenimiento 2018-04-30 Abril de 2019
04-26 10-18

2016-
7.x No LTS N/D 2017-06-30
10-25

2017- 2017- Diciembre de


8.x Carbon13 Activo Abril de 2019
05-30 10-31 2019

2017-
9.x No LTS N/D 2018-06-30
10-01

2018- Octubre
10.x Dubnium13 Activo Abril de 2020 Abril de 2021
04-24 de 2018

2018-
11.x13 No LTS N/D Junio de 2019
10-23

2019- Octubre
12.x13 Pendiente Abril de 2021 Abril de 2022
04-23 de 2019
Comunidad[editar]
Existe una comunidad muy activa de desarrolladores de Node.js que se comunican a
través de grupos de discusión, nodejs y nodejs-dev y el canal IRC#node.js en freenode. La
comunidad se reúne en NodeConf, una convención de desarrolladores centrada en
Node.js.14

Véase también[editar]
 JavaScript
 V8
 NPM, el gestor de paquetes para Node.js.
 Entorno de desarrollo MEAN
 Meteor (framework web)

´+´+´+´+´+

NoSQL
Ir a la navegaciónIr a la búsqueda
En informática, NoSQL (a veces llamado "no sólo SQL") es una amplia clase de sistemas
de gestión de bases de datos que difieren del modelo clásico de SGBDR (Sistema de
Gestión de Bases de Datos Relacionales) en aspectos importantes, siendo el más
destacado que no usan SQL como lenguaje principal de consultas. Los datos almacenados
no requieren estructuras fijas como tablas, normalmente no soportan operaciones JOIN, ni
garantizan completamente ACID(atomicidad, consistencia, aislamiento [isolated] y
durabilidad), y habitualmente escalan bien horizontalmente. Los sistemas NoSQL se
denominan a veces "no sólo SQL" para subrayar el hecho de que también pueden soportar
lenguajes de consulta de tipo SQL.
Por lo general, los investigadores académicos se refieren a este tipo de bases de datos
como almacenamiento estructurado, término que abarca también las bases de datos
relacionales clásicas. A menudo, las bases de datos NoSQL se clasifican según su forma
de almacenar los datos, y comprenden categorías como clave-valor, las implementaciones
de BigTable, bases de datos documentales, y bases de datos orientadas a grafos.
Los sistemas de bases de datos NoSQL crecieron con las principales redes sociales, como
Google, Amazon, Twitter y Facebook. Estas tenían que enfrentarse a desafíos con el
tratamiento de datos que las tradicionales SGBDR no solucionaban {ver articulo}. Con el
crecimiento de la web en tiempo real existía una necesidad de proporcionar información
procesada a partir de grandes volúmenes de datos que tenían unas estructuras
horizontales más o menos similares. Estas compañías se dieron cuenta de que el
rendimiento y sus propiedades de tiempo real eran más importantes que la coherencia, en
la que las bases de datos relacionales tradicionales dedicaban una gran cantidad de
tiempo de proceso[cita requerida].
En ese sentido, a menudo, las bases de datos NoSQL están altamente optimizadas para
las operaciones recuperar y agregar, y normalmente no ofrecen mucho más que la
funcionalidad de almacenar los registros (p.ej. almacenamiento clave-valor). La pérdida de
flexibilidad en tiempo de ejecución, comparado con los sistemas SQL clásicos, se ve
compensada por ganancias significativas en escalabilidad y rendimiento cuando se trata
con ciertos modelos de datos.[cita requerida]

Índice
 1Historia del término
 2Arquitectura
 3Ventajas
 4Desventajas
 5Sistemas
o 5.1Tabla Comparativa de SGBD NoSQL
o 5.2Bases de datos documentales
o 5.3Bases de datos en grafo
o 5.4Bases de datos clave/valor
o 5.5Bases de datos multivalor
o 5.6Bases de datos orientadas a objetos
o 5.7Bases de datos tabular
o 5.8Bases de datos de arrays
 6Referencias
 7Enlaces externos

Historia del término[editar]


Carlo Strozzi usó el término NoSQL en 1998 para referirse a su base de datos. Era una
base de datos open-source, ligera, que no ofrecía un interface SQL, pero sí seguía el
modelo relacional1 (Strozzi sugiere que, ya que el actual movimiento NoSQL "Se sale
completamente del modelo relacional, debería, por tanto, haberse llamado 'NoREL', o algo
así.")2
Eric Evans, un empleado de Rackspace, reintrodujo el término NoSQL cuando Johan
Oskarsson de Last.fm quiso organizar un evento para discutir bases de datos distribuidas
de código abierto. El nombre intentaba recoger el número creciente de bases de datos no
relacionales y distribuidas que no garantizaban ACID, atributo clave en las SGBDR
clásicas.

Arquitectura[editar]
Típicamente las bases de datos relacionales modernas han mostrado poca eficiencia en
determinadas aplicaciones que usan los datos de forma intensiva, incluyendo el indexado
de un gran número de documentos, la presentación de páginas en sitios que tienen gran
tráfico, y en sitios de streaming audiovisual. Las implementaciones típicas de SGBDR se
han afinado o bien para una cantidad pequeña pero frecuente de lecturas y escrituras o
para un gran conjunto de transacciones que tiene pocos accesos de escritura. Por otro
lado NoSQL puede servir gran cantidad de carga de lecturas y escrituras.
Implementaciones de NoSQL usadas en el mundo real incluyen los 3TB de los marcadores
verdes de Digg (indicados para señalar las historias votadas por otros en la red social;
aunque duró menos de 3 meses y fue abandonado); los 6 TB de la base de datos del
“ENSEMBLE” de la Comisión Europea usado en los modelos de comparación y calidad del
aire, y los 50 TB de la búsqueda de la bandeja de entrada de Facebook.
Las arquitecturas NoSQL frecuentemente aportan escasas garantías de consistencia, tales
como consistencia de eventos o transaccional restringida a ítems únicos de datos. Algunos
sistemas, sin embargo, aportan todas las garantías de los sistemas ACID en algunas
instancias añadiendo una capa intermedia (como por ejemplo, AppScale o CloudTPS). Hay
dos sistemas que han sido desplegados y que aportan aislamiento snapshot para
almacenamientos de columna: El sistema Percolator de Google (basado en el sistema
BigTable) y el sistema transaccional de Hbase desarrollado por la universidad de Waterloo.
Estos sistemas, desarrollados de forma independiente, usan conceptos similares para
conseguir transacciones ACID distribuidas de múltiples filas con garantías de aislamiento
snapshot para el sistema subyacente de almacenamiento en esa columna, sin sobrecarga
extra en la gestión de los datos, despliegue en el sistema de middleware, ni mantenimiento
introducido por la capa de middleware.
Bastantes sistemas NoSQL emplean una arquitectura distribuida, manteniendo los datos
de forma redundante en varios servidores, usando frecuentemente una tabla hash
distribuida. De esta forma, el sistema puede realmente escalar añadiendo más servidores,
y el fallo en un servidor puede ser tolerado.
Algunos defensores de NoSQL promueven interfaces simples tales como los arrays
asociativos o los pares clave-valor. Otros sistemas, tales como las bases de datos nativas
en XML, promueven el soporte del estándar Xquery. Los sistemas más novedosos tales
como CloudTPS también soportan unión de queries.

Ventajas[editar]
 Estos sistemas responden a las necesidades de escalabilidad horizontal que tienen
cada vez más empresas.3
 Pueden manejar enormes cantidades de datos.
 No generan cuellos de botella.
 Escalamiento sencillo.
 Diferentes DBs NoSQL para diferentes proyectos.
 Se ejecutan en clusters de máquinas baratas.

Desventajas[editar]
Existen desacuerdos sobre la neutralidad en el punto de vista de la versión
actual de este artículo o sección.
En la página de discusión puedes consultar el debate al respecto.

 Las bases de datos NoSQL al ser de código abierto poseen un soporte diferente al
soporte que ofrecen las compañías comerciales a sus productos. Esto puede
presentar algunas ventajas y también algunas desventajas.

 Algunos productos pueden no estar lo suficientemente maduros para algunas


empresas.- A pesar de sus puestas en práctica en algunas grandes empresas, las
bases de datos NoSQL aún se enfrentan a un problema de credibilidad importante con
muchas empresas. Los críticos señalan la falta de madurez de NoSQL y los posibles
problemas de inestabilidad, mientras que citan la madurez, y una gran funcionalidad y
estabilidad de los SGBDRes. No obstante en desarrollos de sistemas al disponer del
código fuente este se puede ajustar y amoldar a las necesidades concretas de cada
empresa.

 Limitaciones de Inteligencia de Negocios.- Hay una o dos cuestiones acerca de las


capacidades de BI de las bases de datos NoSQL. ¿Pueden estas bases de datos
proporcionar la clase de minería de datos rigurosos que las empresas se utilizan con
las SGBDRes? ¿Cuántos conocimientos de programación se necesitan para hacer la
consulta ad hoc y análisis?. Las respuestas no son precisamente positivas. Las bases
de datos NoSQL no tienen muchos ganchos para el uso general de herramientas de
BI, mientras que la más simple consulta ad-hoc y análisis implica conocimientos de
programación bastante buenos. Sin embargo, las soluciones están disponibles. Quest
Software, por ejemplo, ha creado Toad para bases de datos en la nube, que
proporciona capacidades de consulta ad-hoc para algunas bases de datos NoSQL.

 La falta de experiencia.- La novedad de NoSQL significa que no hay una gran cantidad
de desarrolladores y administradores que conocen la tecnología -lo que hace difícil a
las empresas encontrar personas con los conocimientos técnicos apropiados. Por el
contrario, el mundo SGBDR tiene miles de personas muy cualificadas.
 Problemas de compatibilidad.- A diferencia de las bases de datos relacionales, que
comparten ciertos estándares, las bases de datos NoSQL tienen pocas normas en
común. Cada base de datos NoSQL tiene su propia API, las interfaces de consultas
son únicas y tienen peculiaridades. Esta falta de normas significa que es imposible
cambiar simplemente de un proveedor a otro, por si no quedara satisfecho con el
servicio.

Sistemas[editar]
Tabla Comparativa de SGBD NoSQL[editar]
Bases de datos documentales[editar]
Artículo principal: Base de datos documental

 CouchDB, de Apache CouchDB


 MongoDB, de 10gen
 RavenDB, de Hibernating Rhinos.
 BaseX
 djondb
 eXist
 SimpleDB, de Amazon
 IBM Lotus Domino
 Terrastore
Bases de datos en grafo

´+´+´+´+´+

Ask Question

1
Here is code that I have copied from w3schools, I have different code, but the problem that
I am having still happens in this simplified coding.

<!DOCTYPE html>
<html>
<body>

<p id="demo">Click the button to create an array, then display it's length</p>

<button onclick="myFunction()">Try it</button>

<script>
function myFunction()
{
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var foods = ["steak","pizza","bread","fruits"];
var x=document.getElementById("demo");
var y=foods[3];
x.innerHTML= y.length;
}
</script>

</body>
</html>
When I do x.innerHTML= fruits.length;, I get 4 back which is what I want to get.
But when I call

var y=foods[3];
x.innerHTML= y.length;
I get 6 which is the length of the word "fruits" but I want the length of the array fruits.
How do I do this?
I'm using jQuery, don't know if that affects anything. Do I have to add parenthesis or
brackets somewhere?

javascript jquery

shareimprove this question


edited Jan 20 '13 at 20:20

Felix Kling
546k126849909
asked Jan 20 '13 at 20:11

Dropoff510
317
 No, you don't have to add parenthesis, you just have to query fruits instead of foods. Unless
there's something I'm missing. – Mr Lister Jan 20 '13 at 20:13
 2
Please! Don't use w3schools to teach you anything! – Joseph Silber Jan 20 '13 at 20:14
 possible duplicate of Is there a way to access a javascript variable using a string that contains the name
of the variable? – Felix Kling Jan 20 '13 at 20:17
 2
@JosephSilber Can you stop using w3fools as a reference, please. They are not. – Mr Lister Jan
20 '13 at 20:21
 @FelixKling it's not a duplicate of that because the variable in this question is local, not
global. – Alnitak Jan 20 '13 at 20:22
show 4 more comments
5 Answers
activeoldest votes

¿No encuentras la respuesta? Pregunta en Stack Overflow en español.



3
If (and only if) a variable (myVar) contains the name of a property of another object (myObj)
you can use:
myObj[myVar]
to access that property.

In this case, your fruits array is just a normal local variable, so there's no way (short of the
frowned-upon eval function) to access it indirectly.
You can of course use fruits.length to directly find its length.
A better solution would be a nested object of foods, and not an array:

var foods = {
fruits: [ "Banana", "Orange", "Apple", "Mango" ],
steak: [ ... ],
pizza: [ ... ],
bread: [ ... ]
};
at which point you can use the syntax above and write:

var myType = 'fruits';


var count = foods[myType].length;
shareimprove this answer
edited Jan 20 '13 at 20:35
answered Jan 20 '13 at 20:20

Alnitak
269k62337429
 downvoter, please explain – Alnitak Jan 20 '13 at 20:28
add a comment
2
Maybe what you want is

var fruits = ["Banana", "Orange", "Apple", "Mango"];


var foods = ["steak","pizza","bread", fruits];
This way your code will work, since we have stored a reference to the array fruits inside
the foodsinstead of the string "fruits".
shareimprove this answer
answered Jan 20 '13 at 20:17

Gabriele Petrioli
149k23197253
 this will work, but IMHO it's not a good solution. I'm pretty sure the OP wants to use
the string "fruits" to indirect into that array. – Alnitak Jan 20 '13 at 20:44
 @Alnitak, i am sure using an object is the proper solution to such problems. My answer is a bit
directly based on the var y = foods[3]; part of the question.. – Gabriele Petrioli Jan 20 '13 at
20:47
add a comment
2
You seem to have a huge misunderstanding of the difference between the variable
identifier fruitsand the string "fruits".
Let's describe your code together so you understand well what you are doing.

 var fruits = ["Banana", "Orange", "Apple", "Mango"];


You have a variable named fruits which identifies an array of four elements, all strings.
You could do the following with that array:
alert(fruits.length); // 4
alert(fruits[0]); // Banana
alert(fruits[3]); // Mango
alert(fruits); // Banana, Orange, Apple, Mango

 var foods = ["steak","pizza","bread","fruits"];


You have a variable named foods which identifies an array of four elements, again: all
strings. You could again do the following:
alert(foods.length); // 4
alert(foods[0]); // steak
alert(foods[3]); // fruits
alert(foods); // steak, pizza, bread, fruits

 You try to count the fruits, doing foods[3].length


You should notice that when we did alert(fruits), it displayed Banana, Orange, Apple,
Mango. And when we did alert(foods[3]), it displayed fruits. This should give you a
hint: the array you named fruits and the string "fruits" are two different things!
That is why foods[3].length is 6, because the length of "fruits" is 6.

Solution
EDIT: Check Altiniak's answer. I leave the rest of my post for the long and valid
explaination. The idea of using window was almost worse than using eval()...
shareimprove this answer
edited Jan 20 '13 at 20:41
answered Jan 20 '13 at 20:33

snooze92
3,55021828
 1
fruits is not a global variable so window[foods[3]].length; will not work. The OP's code is
inside a function so nothing get store in the global scope.. – Gabriele Petrioli Jan 20 '13 at 20:35
 +1 for effort, -2 for accuracy – Alnitak Jan 20 '13 at 20:37
 My mistake. I will edit, but there is nothing to add to Alnitak's answer anymore ;) I would upvote
his if I could :P – snooze92 Jan 20 '13 at 20:39
 @snooze92 downvote removed - you're neutral now ;-) Why can't you upvote? – Alnitak Jan 20
'13 at 20:42
 @Alnitak I created my StackOverflow account 2h ago, still missing 6 "reputation points" until I
can upvote :) – snooze92 Jan 20 '13 at 20:44
show 4 more comments
1
In the following:

var y=foods[3];
x.innerHTML= y.length;"
You are assigning the 4th element in the foods array to the y variable, which is the string
"fruits". If you want the length of the array, just do this:
x.innerHTML = foods.length;
EDIT: I am assuming you just want the length of the foods array and NOT to store the
fruits array in the foods variable (if you need that, Gaby's answer can give you that)
shareimprove this answer
edited Jan 20 '13 at 20:21
answered Jan 20 '13 at 20:13
mattytommo
47.6k14101131
 1
He actually wants to access the fruits array by using the foods array. – Amberlamps Jan 20 '13
at 20:15
 @Amberlamps OP says "I get 6 which is the length of the word "fruit" but i want the length of the
array fruit." – mattytommo Jan 20 '13 at 20:16
 2
@mattytommo: Exactly. foods[3] is the word fruits and he wants to access the variable with
that name. I had to read it a couple of times until I understood what the OP wants. – Felix
Kling Jan 20 '13 at 20:18
 @mattytommo: I am pretty sure, that he wants what I described and also what Felix
said. – Amberlamps Jan 20 '13 at 20:19
 The OP clearly wants to indirect from the string "fruits" into the local array of the same
name. – Alnitak Jan 20 '13 at 20:24
show 2 more comments
0
Hope I get what you want. You you have the word "fruits" and from that, you want to fetch
the contents of the var named fruits, right?
That can be done using eval.
var fruitlen = eval('fruits').length;
Is this what you wanted?

shareimprove this answer


answered Jan 20 '13 at 20:20

Mr Lister
34.5k1074115
 eval is evil. :P – Christophe L Jan 20 '13 at 20:23
 @ChristopheL Then let's hope this is not what the OP is asking for! Oh, and I like Alnitak's
answer. – Mr ListerJan 20 '13 at 20:25

+´+´+´+´

Length en Javascript
28 Feb 2011
Compartir en FacebookCompartir en TwitterCompartir en Google+
En Javascript, el comando length es uno de los más utilizados. Para todos los
desarrolladores, length es una de las piezas claves a la hora de recorrer arrays. Sin
embargo, además de como una propiedad, funciona también como un interesante
método aplicable a funciones que permite construir arquitecturas de objetos muy
flexibles. Repasemos todos sus usos con sus correspondientes ejemplos en cada caso:
Length En cadenas ( String )
El valor de la propiedad length en una cadena es igual a su número de caracteres.

Sin embargo, hay que tener en cuenta que el UTF-16, el formato para cadenas utilizado
en Javascript, utiliza una codificación de 16 bits para representar los caracteres más
usuales; en el caso de aquellos más raros, se necesitan dós unidades de código por lo
que puede darse el caso de que el valor length no se corresponda exactamente con el
número de caracteres utilizados en una cadena.

var foo = 'Hello World';


console.log( foo.length ); // 11

var bar = '\uD834\uDD1E'; // MUSICAL SYMBOL G CLEF (D834 y DD1E)


console.log( bar.length ); // 2

Length en arrays ( Array )


En un array, la propiedad length devuelve el número de elementos que contiene,
independientemente de si se tratan tanto de valores falsy como truthly:

var foo = [ 0, 1, 2, '', 'foo', false, undefined, NaN, Infinity, [], {}


console.log( foo.length ); // 11

Editando esta propiedad, podemos truncar un Array en cualquier momento:

var foo = [ 1, 2, 3, 4, 5, 6, 7 ];
foo.length = 3;

console.log( foo ); // 1, 2, 3

Sin embargo, una vez truncado, ampliar la longitud del array no produce ningún
efecto:

foo.length = 6;
console.log( foo ); // 1, 2, 3

Como hemos mencionado al principio, length es el comando clave para recorrer un


array en Javascript:

var foo = [ 1, 2, 3, 4, 5, 6 ];

for( i = 0, j = foo.length; i < j; i++ ){


foo[ i ] = foo[ i ] * 2; // multiply each value by 2
}

console.log( foo ); // [2, 4, 6, 8, 10, 12]


En números y objetos ( Number y Object )
Las variables primitivas Number y Object no tienen propiedad length y devuelven
por tanto undefined:

var foo = 12;


var bar = { id : '12' };

console.log( foo.length ); // undefined


console.log( bar.length ); // undefined

En funciones ( Function )
En el caso de las funciones, length no es una propiedad sino un método. Invocado
directamente sobre el nombre de una función declarada, devuelve el número de
argumentos que espera:

var foo = function( param1, param2, param3 ){


// Do something...
}

console.log( foo.length ); // 3

Invocada en el interior de la misma, puede darnos el número de argumentos que se


han pasado a través de arguments:

var foo = function(){


return arguments.length;
}

console.log( foo( 'param1', 'param2', 'param3', 'param4' ) ); // 4

Conociendo ambos datos, podemos crear una función que nos permita sobreescribir
métodos dependiendo de los valores que tengamos:

function addMethod(object, name, fn){


// Save a reference to the old method
var old = object[ name ];

// Overwrite the method with our new one


object[ name ] = function(){
// Compare incoming arguments with expected

if ( fn.length == arguments.length ) {

// If there was a match, run the function


return fn.apply( this, arguments );

} else if ( typeof old === "function" ) {

// Otherwise, fallback to the old method


return old.apply( this, arguments );
}
};
}

Tomemos ahora un objeto con varios métodos de igual nombre que devolverán un valor
u otro dependiendo de los argumentos:

function Users(){
var users = [ 'Philip K Dick', 'Isaac Asimov', 'Philip J Farmer', 'Orso

// No arguments
addMethod( this, 'find', function(){
return users;
});

// One argument
addMethod( this, 'find', function( name ){
var retUsers = [];
for ( var i = 0; i < users.length; i++ ){
if( users[ i ].indexOf( name ) == 0 ){
retUsers.push( users[ i ] );
}
}
return retUsers;
});

// Two arguments
addMethod( this, 'find', function( first, last ){
var retUsers = [];
for( var i = 0; i < users.length; i++ ){
if(
( users[ i ].indexOf( first ) != -1 ) &&
( users[ i ].indexOf( last ) != -1) ){
retUsers.push( users[ i ] );
}
}
return retUsers;
});
}
var users = new Users();

console.log( users.find() ); // ["Philip K Dick", "Isaac Asimov", "Philip J Farme


console.log( users.find( 'Isaac' ) ); // ["Isaac Asimov"]
console.log( users.find( 'Philip' ) ); // ["Philip K Dick", "Philip
console.log( users.find( 'Orson', 'Card' ) ); // ["Orson Scott
console.log( users.find( 'William', 'Farmer' ) ); // []

En el ejemplo anterior, hemos creado tres métodos con el mismo nombre pero con un
comportamiento diferente basado en el número de argumentos. Esto ofrece una gran
flexibilidad a la hora de crear arquitecturas de objetos complejos que puede resultar
interesante de explotar.

Y hasta aquí este análisis sobre el comando length. Si tenéis más ejemplos de uso
interesantes, no dudéis en compartirlos en los comentarios!
Entradas relacionadas:

1. Cargar Javascript. Blocking vs non-blocking


2. El objeto arguments en Javascript
Currying y aplicaciones parciales
3. Operadores de igualdad en Javascript
4. JSHint, herramienta para medir la calidad del código Javascript
5. Guía Google de estilo Javascript

S-ar putea să vă placă și