Saltar al contenido

¿Cómo encontrar la longitud más larga y más corta de un valor para un campo en mongoDb?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *