MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb gruppiert nach Feld mit $substr

Es gibt eine schmutzige, aber funktionierende Lösung, die auf diesem Link basiert http://www.kamsky.org/stupid-tricks-with-mongodb/ugly-way-to-parse-a-string-with-aggregation-framework Warum also nicht?

Um eine Symbolposition in der Zeichenfolge zu finden, können wir eine komplexe Bedingung erstellen, um jedes Symbol der Zeichenfolge nacheinander auf übereinstimmende Symbole zu überprüfen. Es ist im Grunde ähnlich wie die Funktion indexOf funktioniert.

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];
}

Ihre MongoDB-Anfrage sieht also so aus:

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