6

我将我们的 Web 服务器日志存储在MongoDB中,架构如下所示:

[
  {  
    "_id" : 12345,
    "url" : "http://www.mydomain.com/xyz/abc.html",
    ....
  },
  ....
]

在我开始通过聚合管道传递我的集合之前,我正在尝试使用$project运算符来稍微重塑这个模式。基本上,我需要添加一个名为“type”的新字段,稍后将用于执行分组。新领域的逻辑非常简单。

if "url" contains "pattern_A" then set "type" = "sales lead";
else if "url" contains "pattern_B" then set "type" = "existing client";
...

我想它必须是这样的:

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

我知道如何使用 map-reduce 来做到这一点(通过将“keyf”属性设置为实现上述逻辑的自定义 JS 函数),但现在我正在尝试使用新的聚合框架来做到这一点。我尝试使用表达式运算符来实现逻辑,但到目前为止还不能让它工作。任何帮助/建议将不胜感激!

4

2 回答 2

1

我正在分享我的“解决方案”,以防其他人遇到像我一样的需求。

在研究了几周后,正如@asya-kamsky 在他的一个评论中所建议的那样,我决定在我原来的 MongoDB 模式中添加一个计算字段。这并不理想,因为每当计算字段的逻辑发生更改时,我都必须进行批量更新以更新我的集合中的所有文档,但要么就是这样,要么重写我的代码以使用 MapReduce。我暂时选择了前者。在查看 MongoDB Jira 板时,似乎很多人都要求为$project运算符添加更多不同的运算符,我当然希望 MongoDB 开发团队能够尽快添加它们

基于分隔符拆分字符串的运算符。

新的投影运算符 $elemMatch

在 $project 中允许 $slice 运算符

将 $inOrder 运算符添加到 $project

于 2013-01-03T20:00:16.613 回答
0

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

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

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

你可以嵌套这些,以便第三个元素本身就是一个$cond表达式来获取 if-then-else-if-then-etc。

字符串操作有点尴尬,但你确实有$substr

如果您发布一些您尝试过的确切示例,我可能会发现它为什么不起作用。

于 2012-11-05T00:35:21.850 回答