'like' или запрос $regex внутри $cond в MongoDB

Пожалуйста, просмотрите мой вопрос:
MongoDB $group и явное формирование группы с вычисляемым столбцом

Но на этот раз мне нужно сравнивать строки, а не числа. Запрос CASE должен иметь LIKE:
CASE WHEN source LIKE '%Web%' THEN 'Web'

Затем мне нужно сгруппировать по источнику. Как написать это на монго? Я пытаюсь сделать следующее, но не уверен, что $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. Использование $regex дает ошибку недопустимого оператора, тогда как использование $eq не понимает выражение регулярного выражения и помещает все в «Другие». Если это возможно с регулярным выражением, пожалуйста, дайте мне знать, как написать его для совпадения без учета регистра.

Спасибо за любую помощь :-)


person Aafreen Sheikh    schedule 21.01.2013    source источник
comment
Для первый параметр $cond. Так что нет $regex.   -  person JohnnyHK    schedule 21.01.2013
comment
О, :( Я успешно использовал $eq внутри $cond в одном из своих запросов.. Но это запрос LIKE.. Нет ли обходного пути? Может быть, мне нужно очистить мои данные отдельно перед агрегированием..   -  person Aafreen Sheikh    schedule 22.01.2013


Ответы (2)


Что ж, кажется, его даже не планируется реализовать :( https://jira.mongodb.org/browse/SERVER-8892

Я использую 2.6 и заглянул в 3.0, но его там просто нет.

Однако есть один обходной путь, если вы можете спроецировать свою проблему на стабильную подстроку. Затем вы можете $substr поле и использовать несколько вложенных $cond. Это неудобно, но это работает.

person pkopac    schedule 04.03.2015
comment
Не могли бы вы разработать немного больше вашего обходного пути, это немного неясно ... Спасибо! - person Anthony O.; 10.09.2015
comment
Сначала я проецировал значение с помощью $substr, например, давая мне 0-10-е символы строки, затем я проверял на равенство, что возможно в $cond. Под стабильным я имел в виду стабильное положение подстроки в проверяемых строках. Но с тех пор мы переписали это в Spark. - person pkopac; 11.09.2015
comment
Спасибо. Так что это не совсем регулярное выражение, как я понимаю. - person Anthony O.; 11.09.2015
comment
Нет, регулярное выражение невозможно, это просто обходной путь для очень конкретного случая. - person pkopac; 11.09.2015

Может быть, вы можете попробовать это с 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.

person rubenfa    schedule 27.11.2013