sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb agrupa por campo usando $ substr

Hay una solución sucia pero funcional basada en este enlace http://www.kamsky.org/stupid-tricks-with-mongodb/ugly-way-to-parse-a-string-with-aggregation-framework Entonces, ¿por qué no?

Para encontrar la posición de un símbolo en la cadena, podemos crear una condición compleja para verificar secuencialmente cada símbolo de la cadena en busca de un símbolo coincidente. Es básicamente similar a cómo funciona la función indexOf.

function indexOf(field, character) {
    var array = [];
    var maxPos = 50;
    var searchStart = 0;

    array[maxPos]={"$cond":{"if":{"$eq":[{"$substr":[field,maxPos,1]},character]},"then":maxPos+1,else:0}};

    for ( var i=maxPos-1; i>searchStart-1; i-- ) {
         array[i]={"$cond":{"if":{"$eq":[{"$substr":[field,i,1]},character]},"then":i,"else":array[i+1]}}
    }

    return array[searchStart];
}

Entonces, su solicitud de MongoDB se verá así:

db.images.aggregate([ <query> ,
             { $group: { _id: { $substr: ["$FileName", indexOf("$FileName", "_"), 999] }, files: { $push: "$$ROOT" } } },
             { $sort: { UploadDate : -1 } }
        ])