Istnieje brudne, ale działające rozwiązanie oparte na tym łączu http://www.kamsky.org/stupid-tricks-with-mongodb/ugly-way-to-parse-a-string-with-aggregation-framework Dlaczego więc nie?
Aby znaleźć pozycję symbolu w ciągu, możemy zbudować złożony warunek, aby kolejno sprawdzać każdy symbol ciągu pod kątem pasującego symbolu. Jest to w zasadzie podobne do działania funkcji 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];
}
Twoje żądanie MongoDB będzie więc wyglądać tak:
db.images.aggregate([ <query> ,
{ $group: { _id: { $substr: ["$FileName", indexOf("$FileName", "_"), 999] }, files: { $push: "$$ROOT" } } },
{ $sort: { UploadDate : -1 } }
])