Evite agregar el límite de 16MB

Tengo una colección de alrededor de 1M documentos. Cada documento tiene internalNumber propiedad internalNumber y necesito obtener todos internalNumber números internalNumber en mi código node.js.

Anteriormente estaba usando

 db.docs.distinct("internalNumber") 

o

 collection.distinct('internalNumber', {}, {},(err, result) => { /* ... */ }) 

en el nodo.

Pero con el crecimiento de la colección, comencé a obtener el error: distinct is too big, 16m cap .

Ahora quiero usar la agregación. Consume mucha memoria y es lenta, pero está bien ya que necesito hacerlo solo una vez al inicio del script. He intentado seguir en la herramienta Robo 3T GUI:

 db.docs.aggregate([{$group: {_id: '$internalNumber'} }]); 

Funciona, y quería usarlo en el código node.js de la siguiente manera:

 collection.aggregate([{$group: {_id: '$internalNumber'} }], (err, docs) => { /* ... * }); 

Pero en el nodo, "MongoError: aggregation result exceeds maximum document size (16MB) at Function.MongoError.create" un error: "MongoError: aggregation result exceeds maximum document size (16MB) at Function.MongoError.create" .

Por favor ayuda a superar ese límite.

El problema es que el controlador nativo difiere de cómo funciona el método de shell de manera predeterminada, ya que el “shell” devuelve un objeto “cursor” cuando el controlador nativo necesita esta opción “explícitamente”.

Sin un “cursor”, .aggregate() devuelve un solo documento BSON como una matriz de documentos, por lo que lo convertimos en un cursor para evitar la limitación:

 let cursor = collection.aggregate( [{ "$group": { "_id": "$internalNumber" } }], { "cursor": { "batchSize": 500 } } ); cursor.toArray((err,docs) => { // work with resuls }); 

Luego, puede usar métodos regulares como .toArray() para convertir los resultados en una matriz de JavaScript que en el ‘cliente’ no comparte las mismas limitaciones u otros métodos para iterar un “cursor” .

Para los usuarios de Casbah:

 val pipeline = ... collection.aggregate(pipeline, AggregationOptions(batchSize = 500, outputMode = AggregationOptions.CURSOR)