Tengo una consulta:

ownUnnamedPages = Entries.find( { author : this.userId, title : {$regex: /^unnamed-/ }}, {sort: { title: 1 }}).fetch()

Que devuelve la siguiente matriz ordenada:

[ { 
    title: 'unnamed-1',
    text: '<p>sdaasdasdasd</p>',
    tags: [],
    _id: 'Wkxxpapm8bbiq59ig',
    author: 'AHSwfYgeGmur9oHzu',
    visibility: 'public' },
{ 
    title: 'unnamed-10',
    text: '',
    author: 'AHSwfYgeGmur9oHzu',
    visibility: 'public',
    _id: 'aDSN2XFjQPh9HPu4c' },
{ 
    title: 'unnamed-2',
    text: '<p>kkhjk</p>',
    tags: [],
    _id: 'iM9FMCsyzehQvYGKj',
    author: 'AHSwfYgeGmur9oHzu',
    visibility: 'public' },
{ 
    title: 'unnamed-3',
    text: '',
    tags: [],
    _id: 'zK2w9MEQGnwsm3Cqh',
    author: 'AHSwfYgeGmur9oHzu',
    visibility: 'public' }]

El problema es que parece que ordenar en la primera de carácter numérico es lo que cree la secuencia correcta es de 1, 10, 2, 3, etc….
lo que yo realmente quiero es que se ordene en tanto toda la parte numérica, de modo que 10 sería al final.

Prefiero no hacerlo por tener números adicionales tales como 01 o 001 para los números.

¿Cómo puedo hacer eso?

InformationsquelleAutor funkyeah | 2013-04-20

5 Comentarios

  1. 16

    MongoDB no puede ordenar por números almacenados como cadenas. Usted tiene que guardar el número como un número entero en su propio campo, rellenar con ceros a la izquierda, o de ordenar los resultados después de que han sido devueltos a partir de la base de datos.

    • Deseo mongodb puede ordenar números almacenados como cadenas 🙁
    • db.collectionName.find().sort({title: 1}).intercalación({locale: «es_es», numericOrdering: true})
    • No hay verificación de enlace
  2. 5

    Si 0 almohadilla de los números que usted será capaz de buscar como una cadena en el orden correcto, así que en lugar de 0,1,2,3,4,5,6,7,8,9,10,11…
    uso 01,02,03,04,05,06,07,08,09,10,11…
    y una cadena de búsqueda se mostrarán en orden.

    • eso es muy interesante! ¿puede explicar cómo funciona? yo estoy dispuesto a intentar. \o/
    • la cadena se ordenan en orden ascii, por lo que va de 1, 10, 2, 3… para ordenar cadenas en orden numérico, usted necesita a cero de la almohadilla de la cadena, por lo que termina en el orden ascii 01, 02, 03,…,10
    • obviamente, necesita de la almohadilla con la suficiente 0 para cubrir la gama completa de integrr que va a utilizar, porque 100 es todavía va a venir antes del 20 de si sólo el cero de la almohadilla de 2 dígitos. 01, 02…,10…100, 20 debe ser acolchado como 001, 002, 003,… 010, … 020, …, 100…
  3. 5

    Puede utilizar

    db.collectionName.find().sort({title: 1}).collation({locale: "en_US", numericOrdering: true})

    numericOrdering bandera es booleano y es Opcional. Indicador que determina si se va a comparar numéricos en cadenas de caracteres o números como cadenas.
    Si es true, comparar números; es decir, el «10» es mayor que «2».
    Si es false, se comparan como cadenas; es decir, el «10» es menor que «2».
    El valor predeterminado es false.

    • Esto funciona en realidad. Gracias!
    • Funciona de verdad!!!!!!!! Gracias!
  4. 0

    En mongo no es posible (ordenar cadenas de caracteres en ascii), pero usted puede ordenar con la siguiente función después de obtener todos los documentos de la colección

    const sortString = (a, b) => {
      const AA = a.title.split('-');
      const BB = b.title.split('-');
    
      if (parseInt(AA[1], 10) === parseInt(BB[1], 10)) {
        return 0;
      }
      return (parseInt(AA[1], 10) < parseInt(BB[1], 10)) ? -1 : 1;
    };
    
    document.sort(sortString);
    • Una expresión regular que podría ser más apropiado que la creación de una matriz de utilizar únicamente el 1st índice de la misma.
    • No hay verificación de enlace
  5. 0

    En mi caso trabajamos con las agregaciones. El enfoque fue ordenar el uso de la longitud de nuestra cadena; sólo funciona cuando la parte de texto es siempre el mismo (sin nombre – en su caso)

    db.YourCollection.aggregate([
      {
        $addFields: {
          "TitleSize": { $strLenCP: "$Title" }
        }
      },
      {
        $sort: {
          "TitleIdSize": 1,
          "Title": 1
        }
      }
    ]);

    Ahora podemos ordenar el uso de la longitud, el segundo tipo de uso del contenido.

    Ejemplo:

    • «sin nombre-2», Titlesize: 9
    • «sin nombre-7», Titlesize: 9
    • «sin nombre-30», Titlesize: 10
    • «sin nombre-1», Titlesize: 9

    La primera clase va a poner el id en este orden: 2, 7, 1, 30. A continuación, el segundo tipo será poner el id en el orden correcto: 1, 2, 7, 30.

    • Sabemos que esta es una vieja pregunta, pero puede ser útil. Si alguien puede probar en una .find() función será agradable.

Dejar respuesta

Please enter your comment!
Please enter your name here