10

请通过我的这个问题:
MongoDB $group and explicit group formation with computed column

但这一次,我需要比较字符串,而不是数字。CASE查询必须有一个LIKE:
CASE WHEN source LIKE '%Web%' THEN 'Web'

然后我需要按源分组。如何在 Mongo 中写这个?我正在尝试以下但不确定是否$regex支持内部$cond。顺便说一句,$cond某处是否有有效运算符的列表?看起来$cond不是很喜欢我:)

db.Twitter.aggregate(
    { $project: { 
        "_id":0,
        "Source": {
            $cond: [
                { $regex:['$source','/.* Android.*/'] },
                'Android', 
                { $cond: [
                    { $eq: ['$source', 'web'] }, 'Web', 'Others'
                ] } 
            ]
        }
    } }
);

我需要在其中写入许多其他值,以进行更深的嵌套。为简洁起见,这只是一个仅包含“Android”和“Web”的示例。我已经尝试过$eq$regex。Using$regex给出了无效运算符的错误,而 using$eq不理解正则表达式并将所有内容放在“其他”下。如果使用正则表达式可以做到这一点,请告诉我如何编写它以进行不区分大小写的匹配。

谢谢你的帮助 :-)

4

2 回答 2

1

好吧,它似乎仍然没有计划实施:( https://jira.mongodb.org/browse/SERVER-8892

我正在使用 2.6 并查看了 3.0,但它不存在。

但是,如果您可以将问题投射到稳定的子字符串上,则有一种解决方法。然后你可以 $substr 字段并使用多个嵌套的 $cond。这很尴尬,但它有效。

于 2015-03-04T14:31:39.230 回答
0

也许你可以用 MapReduce 试试。

var map = function()
{
    var reg1=new RegExp("(Android)+");
    var reg2=new RegExp("(web)+");

    if (reg1.test(this.source)){
        emit(this._id,'Android');
    }
    else if  (reg2.test(this.source))
    {
        emit(this._id,'web');
    }

}

var reduce = function (key,value){
    var reduced = {
        id:key,
        source:value
    }    
    return reduced;

}

db.Twitter.mapReduce(map,reduce,{out:'map_reduce_result'});

db.map_reduce_result.find();

您可以使用 JavaScript 正则表达式而不是 MongoDB $regex。

于 2013-11-27T21:52:13.617 回答