MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb regrouper par champ en utilisant $substr

Il existe une solution sale mais fonctionnelle basée sur ce lien http://www.kamsky.org/stupid-tricks-with-mongodb/ugly-way-to-parse-a-string-with-aggregation-framework Alors, pourquoi pas ?

Pour trouver une position de symbole dans la chaîne, nous pouvons créer une condition complexe pour vérifier séquentiellement chaque symbole de la chaîne pour le symbole correspondant. Il est fondamentalement similaire au fonctionnement de la fonction 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];
}

Ainsi, votre requête MongoDB ressemblera à ceci :

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