我保存我们的Web服务器日志中MongoDB和模式类似于如下:
[
{
"_id" : 12345,
"url" : "http://www.mydomain.com/xyz/abc.html",
....
},
....
]
我试图用$project
操作之前,我开始传递重塑这个模式一点点我的收藏通过一个聚合管道。基本上,我需要添加一个名为“type”的新字段,稍后将用于执行group-by。新领域的逻辑非常简单。
if "url" contains "pattern_A" then set "type" = "sales lead";
else if "url" contains "pattern_B" then set "type" = "existing client";
...
我想它会是这样的:(由“keyf”属性设置为自定义的JS功能
db.weblog.aggregate(
{
$project : {
type : { /* how to implement the logic??? */ }
}
}
);
我知道如何使用的map-reduce做到这一点实现上述逻辑),但现在试图使用new aggregation framework来执行此操作。我试图使用expression operators来实现逻辑,但到目前为止无法实现它的工作。任何帮助/建议将不胜感激!
感谢您的答复。当我意识到无法使用支持的字符串运算符检查字符串模式的存在时,您的建议是我尝试的第一件事,并迅速遇到了死胡同。我需要像indexOf()这样的东西来查找url中的某些模式。 – Edenbauer
哪里可以在“url”中出现子字符串?在您最初编写文档时存储是否可行? –
我有类似的情况。我有两个字段A和B,它们在文档中的存在是相互排斥的。当A存在时,我必须由A分组,当B存在时按B分组,但是看起来您不能在$ project中拥有$ cond ..我尝试用两种方式编写$ project: {$ project:{MyKey {$ cond:[{$ exists:[“$ A”,true]},“$ A”,“$ B”]}}} {$ project:{MyKey:{$ cond:[{ A“:{$ exists:true}},”$ A“,”$ B“]}}} 但是我不断收到错误:{ ”errmsg“:”exception:invalid operator'$ exists' “code”:15999, “ok”:0 } ......也许这只是一个令人讨厌的语法问题:( –