请仔细阅读我的这个问题:
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
。使用$regex
会给出无效运算符的错误,而使用$eq
则无法理解正则表达式并将所有内容置于“其他”下。如果这可以使用正则表达式,请告诉我如何编写它以区分大小写匹配。
感谢您的帮助: - )
答案 0 :(得分:1)
好吧,它似乎甚至没有安排实施:( https://jira.mongodb.org/browse/SERVER-8892
我使用2.6并看了3.0,但它不存在。
如果您可以将问题投射到稳定的子字符串上,那么可以采用一种解决方法。然后你可以$ substr字段并使用多个嵌套的$ cond。它很尴尬,但它确实有效。
答案 1 :(得分: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。