Consulta de la colección MongoDB de 20M-Record

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);
    });