Storify guarda una gran cantidad de metadatos sobre elementos sociales:tweets, actualizaciones de estado de Facebook, publicaciones de blog, artículos de noticias, etc. MongoDB es excelente para almacenar este tipo de datos no estructurados, pero la semana pasada tuve que corregir algunas inconsistencias en la colección de elementos de 20 millones de registros. .
El script era simple:encontrar elementos, ver si no hay dependencias, eliminar elementos huérfanos, sin embargo, se estaba agotando el tiempo o simplemente no respondía. Después de unas horas de ejecutar diferentes modificaciones, se me ocurrió la solución funcional.
Estas son algunas de las sugerencias cuando se trata de grandes colecciones en la pila Node.js + MongoDB:
Hazte amigo de Shell
Concha interactiva, o mongo , es un buen lugar para comenzar. Para iniciarlo, simplemente escriba mongo en la ventana de tu terminal:
$ mongo
Suponiendo que haya configurado las rutas correctas durante la instalación de MongoDB, el comando iniciará el shell y presentará la abrazadera angular.
>
Usar archivos JS
Para ejecutar un archivo JavaScript en un shell de Mongo, ejecute:
$ mongo fix.js --shell
Las consultas tienen el mismo aspecto:
db.elements.find({...}).limit(10).forEach(printjson);
Para generar resultados, use:
print();
o
printjson();
Para conectarse a una base de datos:
db = connect("<host>:<port>/<dbname>")
Desglose
Separe su consulta en algunos scripts con consultas más pequeñas. Puede enviar cada secuencia de comandos a un archivo (como JSON o CSV) y luego mirar la salida y ver si su secuencia de comandos está haciendo lo que realmente se supone que debe hacer.
Para ejecutar el archivo JavaScript (fix.js) y mostrar los resultados en otro archivo (fix.txt) en lugar de la pantalla, use:
$ mongo fix.js > fix.txt --shell
o
$ mongo --quiet fix.js > fix.txt --shell
Recuento de cheques()
Simplemente ejecuta count() para ver el número de elementos en la colección:
db.collection.count();
o un cursor:
[Nota al margen]
Leer publicaciones de blog es bueno, pero ver cursos en video es aún mejor porque son más atractivos.
Muchos desarrolladores se quejaron de la falta de material de video de calidad asequible en Node. Es una distracción ver videos de YouTube y una locura pagar $ 500 por un curso de video de Node.
Visite Node University, que tiene cursos de video GRATUITOS en Node:node.university.
[Fin de la nota al margen]
db.collection.find({…}).count();
Límite de uso()
Puede aplicar limit() función a su cursor sin modificar nada más en una secuencia de comandos para probar la salida sin perder demasiado tiempo esperando el resultado completo.
Por ejemplo:
db.find({…}).limit(10).forEach(function() {…});
o
db.find({…}).limit(1).forEach(function() {…});
es mejor que usar:
db.findOne({…})
porque findOne() devuelve un solo documento mientras find() y limit() aún devuelve un cursor.
Índice de visitas
pista() index le permitirá usar manualmente un índice particular:
db.elemetns.find({…}).hint({active:1, status:1, slug:1});
Asegúrese de tener índices reales con ensureIndex() :
db.collection.ensureIndex({…})
Reducir
Utilice criterios adicionales como $ne , $donde , $en , por ejemplo:
db.elements.find({ $and:[{type:'link'}
,{"source.href":{$exists:true}}
,{'date.created':{$gt: new Date("November 30 2012")}}
,{$where: function () {
if (this.meta&&this.data&&this.data&&this.data.link) {
return this.meta.title!=this.data.link.title;
} else {
return false;
}}}
, {'date.created': {$lt: new Date("December 2 2012")}}]}).forEach(function(e, index, array){
print(e._id.str);
});