MongoDB聚合$项目

Ede*_*uer 6 mongodb aggregation-framework

我将我们的Web服务器日志存储在MongoDB中,模式类似于以下内容:

[
  {  
    "_id" : 12345,
    "url" : "http://www.mydomain.com/xyz/abc.html",
    ....
  },
  ....
]
Run Code Online (Sandbox Code Playgroud)

$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";
...
Run Code Online (Sandbox Code Playgroud)

我想它必须是这样的:

db.weblog.aggregate(
  { 
    $project : {
      type : { /* how to implement the logic??? */ }
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

我知道如何使用map-reduce(通过将"keyf"属性设置为实现上述逻辑的自定义JS函数)来执行此操作,但现在我正在尝试使用新的聚合框架来执行此操作.我尝试使用表达式运算符实现逻辑,但到目前为止无法使其工作.任何帮助/建议将不胜感激!

Asy*_*sky 0

您需要使用多个运算符和表达式的组合。

首先,$cond运算符 in$project允许您实现 if then else 逻辑。

$cond:采用三个元素的数组,第一个是布尔表达式,第二个和第三个是用于字段值的值 - 如果布尔表达式为 true,则使用第二个元素作为值,如果不是,则使用第三个元素。

您可以嵌套它们,以便第三个元素本身就是一个$cond表达式来获取 if-then-else-if-then- 等。

字符串操作有点尴尬,但你确实可以$substr使用。

如果您发布一些您尝试过的示例,我也许能够找出它不起作用的原因。