Mongodb 使用 $substr 按字段分组

Eug*_*ene 5 mongodb

我有一个按文件名分组的查询。就像是

db.images.aggregate([ <query> ,        

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

             { $sort: { UploadDate : -1 } }
        ])
Run Code Online (Sandbox Code Playgroud)

我需要在子字符串函数中设置起始索引以首先匹配符号“_”。类似的东西"$FileName.indexOf('_')"。有人可以帮助我吗?

edt*_*ech 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];
}
Run Code Online (Sandbox Code Playgroud)

因此,您的 MongoDB 请求将如下所示:

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