este problema se puede solucionar de diversas formas, por lo tanto te compartimos la que en nuestra opinión es la resolución más completa.
Solución:
Puede usar un script de shell mongo. Tenga en cuenta que realizará un escaneo completo de la tabla.
function findMinMax()
var max = 0;
var min = db.collection.findOne().fieldName.length;
db.collection.find().forEach(function(doc)
var currentLength = doc.fieldName.length;
if (currentLength > max)
max = currentLength;
if (currentLength < min)
min = currentLength;
);
print(max);
print(min);
use
findMinMax();
Puede guardar la función en un archivo, digamos c:minMax.js y ejecutar el archivo como,
c:mongodbbin> mongo dbName < c:minMax.js
Nota: es posible que deba proporcionar el nombre de host, el nombre de usuario y la contraseña necesarios para conectarse a su base de datos.
c:mongodbbin> mongo --host hostName --port portNumber -u userName -p password dbName < c:minMax.js
En versiones modernas, MongoDB tiene la $strLenBytes
o $strLenCP
operadores de agregación que le permiten simplemente hacer:
Class.collection.aggregate([
"$group" =>
"_id" => nil,
"max" => "$max" => "$strLenCP" => "$a" ,
"min" => "$min" => "$strLenCP" => "$a"
])
Donde "a"
es el string propiedad en su documento de la que desea obtener la longitud mínima y máxima.
Para generar la longitud mínima y máxima, el mejor enfoque disponible es usar mapReduce con algunos trucos para mantener los valores.
Primero, define una función de mapeo que realmente generará un solo elemento de su colección para reducir la carga:
map = Q%
function ()
if ( this.a.length < store[0] )
store[0] = this.a.length;
if ( this.a.length > store[1] )
store[1] = this.a.length;
if ( count == 0 )
emit( null, 0 );
count++;
Dado que esto funciona principalmente con una variable de alcance global que mantiene las longitudes mínima y máxima, solo desea sustituir esto en un finalize
función en el único documento emitido. No hay una etapa de reducción, pero defina una función "en blanco" para esto aunque no se llame:
reduce = Q% function()
finalize = Q%
function(key,value)
return
min: store[0],
max: store[1]
;
Luego llame a la operación mapReduce:
Class.map_reduce(map,reduce).out(inline: 1).finalize(finalize).scope(store: [], count: 0)
Entonces, todo el trabajo se realiza en el servidor y no mediante la iteración de los resultados enviados a la aplicación cliente. En un pequeño set como este:
"_id" : ObjectId("543e8ee7ddd272814f919472"), "a" : "this"
"_id" : ObjectId("543e8eedddd272814f919473"), "a" : "something"
"_id" : ObjectId("543e8ef6ddd272814f919474"), "a" : "other"
Obtiene un resultado como este (salida de shell, pero muy similar para el controlador):
"results" : [
"_id" : null,
"value" :
"min" : 4,
"max" : 9
],
"timeMillis" : 1,
"counts" :
"input" : 3,
"emit" : 1,
"reduce" : 0,
"output" : 1
,
"ok" : 1
Por lo tanto, mapReduce permite que el procesamiento de JavaScript en el servidor lo haga con bastante rapidez, lo que reduce el tráfico de su red. En la actualidad, no hay otra forma nativa para que MongoDB devuelva un string longitud en este momento, por lo que el procesamiento de JavaScript es necesario en el servidor.
Para obtener el valor más largo de un campo
db.entities.aggregate([ $match: condition ,
$addFields:
"length": $strLenCP: "$feildName"
,
"$sort": "length": -1 ,
$limit:1
])
Cambie "$ordenar": "longitud": -1 a "$ordenar": "longitud": 1 para obtener el valor más corto de un campo
Si te gusta la programación, eres capaz de dejar un escrito acerca de qué te ha gustado de esta división.