首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB聚合$project

MongoDB聚合$project
EN

Stack Overflow用户
提问于 2012-11-05 06:02:32
回答 2查看 4.8K关注 0票数 6

我将我们的web服务器日志存储在MongoDB中,模式类似于:

代码语言:javascript
运行
复制
[
  {  
    "_id" : 12345,
    "url" : "http://www.mydomain.com/xyz/abc.html",
    ....
  },
  ....
]

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

代码语言:javascript
运行
复制
if "url" contains "pattern_A" then set "type" = "sales lead";
else if "url" contains "pattern_B" then set "type" = "existing client";
...

我想应该是这样的:

代码语言:javascript
运行
复制
db.weblog.aggregate(
  { 
    $project : {
      type : { /* how to implement the logic??? */ }
    }
  }
);

我知道如何使用map-reduce (通过将"keyf“属性设置为实现上述逻辑的自定义JS函数)来完成此操作,但现在我正尝试使用new aggregation framework来完成此操作。我试图使用expression operators实现逻辑,但到目前为止还不能正常工作。如有任何帮助/建议,我们将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2013-01-04 04:00:17

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

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

Operator for splitting string based on a separator.

New projection operator $elemMatch

Allow $slice operator in $project

add a $inOrder operator to $project

票数 1
EN

Stack Overflow用户

发布于 2012-11-05 08:35:22

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

首先,$project中的$cond操作符允许您实现if then else逻辑。

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

您可以对这些元素进行嵌套,这样第三个元素本身就是一个$cond表达式,以获得if-then-else-if-then-etc。

字符串操作有点笨拙,但您确实有可用的$substr

如果你贴出一些你尝试过的例子,我也许能找出为什么它不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13223400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档