2015-02-02 3 views
4

У меня есть запрос для группировки по имени файла. Что-то вроде

db.images.aggregate([ <query> ,   

      { $group: { _id: { $substr: [ "$FileName", 3, -1 ] }, files: { $push: "$$ROOT" } } }, 

      { $sort: { UploadDate : -1 } } 
     ]) 

Мне нужно установить индекс начала в подстроке, чтобы сначала совместить символ «_». Что-то вроде "$FileName.indexOf('_')". Может ли кто-нибудь мне помочь?

+1

Там нет оператора, чтобы сделать это в рамках агрегации в настоящее время; связанная с этим проблема - [SERVER-8951] (https://jira.mongodb.org/browse/SERVER-8951). Я бы предложил, чтобы вставить, вычисляя подстроку перед первым экземпляром «_» и сохраняя ее в документе, в качестве обходного пути. – wdberkeley

+0

Спасибо, я сделал то же самое, что и обходное решение –

ответ

0

Существует грязное, но рабочее решение на основе этой ссылки 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 } } 
     ]) 
Смежные вопросы