Существует грязное, но рабочее решение на основе этой ссылки http://www.kamsky.org/stupid-tricks-with-mongodb/ugly-way-to-parse-a-string-with-aggregation-framework Итак, почему бы и нет?
Чтобы найти положение символа в строке, мы можем построить сложное условие, чтобы последовательно проверять каждый символ строки для соответствия символу. Это в основном аналогично тому, как работает функция 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];
}
Таким образом, ваш запрос MongoDB будет выглядеть следующим образом:
db.images.aggregate([ <query> ,
{ $group: { _id: { $substr: ["$FileName", indexOf("$FileName", "_"), 999] }, files: { $push: "$$ROOT" } } },
{ $sort: { UploadDate : -1 } }
])
Там нет оператора, чтобы сделать это в рамках агрегации в настоящее время; связанная с этим проблема - [SERVER-8951] (https://jira.mongodb.org/browse/SERVER-8951). Я бы предложил, чтобы вставить, вычисляя подстроку перед первым экземпляром «_» и сохраняя ее в документе, в качестве обходного пути. – wdberkeley
Спасибо, я сделал то же самое, что и обходное решение –