node.js - tutorial - npm
Evite el lĂmite agregado de 16 MB (2)
El problema es que el controlador nativo difiere de la forma en que funciona el método de shell de forma predeterminada, ya que el "shell" realmente está devolviendo un objeto "cursor" donde 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 hacer que los resultados sean una matriz de JavaScript que en el ''cliente'' no comparte las mismas limitaciones, u otros métodos para iterar un "cursor" .
Tengo una colección de aproximadamente 1 millón de documentos. Cada documento tiene internalNumber
propiedad innerNumber y necesito obtener todos los internalNumber
en mi código node.js.
Anteriormente estaba usando
db.docs.distinct("internalNumber")
o
collection.distinct(''internalNumber'', {}, {},(err, result) => { /* ... */ })
en 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 en el inicio del script. Intenté seguir en la herramienta GUI 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 Nodo recibo un error: "MongoError: aggregation result exceeds maximum document size (16MB) at Function.MongoError.create"
.
Por favor ayuda a superar ese límite.
Para los usuarios de Casbah:
val pipeline = ...
collection.aggregate(pipeline, AggregationOptions(batchSize = 500, outputMode = AggregationOptions.CURSOR)