【问题标题】:MongoDB: any way to use a user defined function in an aggregation?MongoDB:在聚合中使用用户定义函数的任何方式?
【发布时间】:2015-06-30 01:05:25
【问题描述】:

我有以下记录:

{ "_id" : ObjectId("55889370ba09474fd178d8b8"), "url" : "http://stackoverflow.com/questions/ask"} 
{ "_id" : ObjectId("55889370ba09474fd178d8b4"), "url" : "http://stackoverflow.com"}
{ "_id" : ObjectId("55889370ba09474fd178d8b2"), "url" : "http://espn.com"}

我想做一个聚合来获取每个站点的根数。基本上我希望前两条记录都属于同一组(它们具有相同的根)。

我创建了一个用户定义的函数来将 url 转换为其根。我的想法是使用用户定义的函数首先投影记录(更改 url 字段),然后按 url 分组。问题是显然用户定义的函数不能用于聚合。它们可以在投影的 where 子句中使用,但带有 where 子句的投影不能在聚合中使用。

有什么方法可以聚合我需要的吗?

编辑:

也许为了使示例更具说明性,我应该补充一点,例如,如果我想按根网站分组并计算它们,我会得到如下信息:

{ "_id" : "http://stackoverflow.com", "count" : 2}
{ "_id" : "http://espn.com", "count" : 1}

【问题讨论】:

  • 您实际上是在使用 $regex 寻找 $project 过滤器,但目前聚合框架没有此功能,有一个开放的 JIRA 在这里 SERVER-11947.
  • 那么目前没有办法吗?没有其他选择?
  • 另一种方法是使用 Map-Reduce
  • @chridam 是的,Map-Reduce 可能是唯一的方法,但我正在寻找更简单的方法。

标签: mongodb aggregation-framework


【解决方案1】:

聚合时尽量使用regex。我认为您可能会为此跳过用户定义的函数。

这个question 就是利用它的例子。

在您的特定情况下,描述了一种解决方法here。不确定这是否是您想要的。

否则我担心你必须映射减少它。

【讨论】:

  • 在这种情况下,匹配子句中没有使用正则表达式吗?我不想过滤任何记录。我只想在投影期间转换一个字段,以便在分组期间它们可以属于同一个键。
  • 没错,但我认为这个解决方法可能很有趣:stackoverflow.com/a/17493547/1566187 你能确认吗?否则,只需使用我想说的 map-reduce。
【解决方案2】:

这是一个简单的解决方案。示例数据为:

> db.test.find()
{ "_id" : ObjectId("559178703535798edab41c36"), "text" : "aaaasfadf" }
{ "_id" : ObjectId("559178743535798edab41c37"), "text" : "bfasdfasdf" }
{ "_id" : ObjectId("559178783535798edab41c38"), "text" : "aasdfsdf" }
{ "_id" : ObjectId("5591787b3535798edab41c39"), "text" : "asdf" }
{ "_id" : ObjectId("5591787e3535798edab41c3a"), "text" : "csfd" }

我想根据字符串的第一个字母对项目进行分组(您将提取 URL 基础的函数放在此处):

db.test.group({
    $keyf : function(doc){
        return {
            key : doc.text.substring(0,1) // extract URL base here
        }
    },
    $reduce : function(curr, result){
        result.count++
    },
    initial : {
        count: 0
    }
})

结果是:

[
    {
        "key" : "a",
        "count" : 3
    },
    {
        "key" : "b",
        "count" : 1
    },
    {
        "key" : "c",
        "count" : 1
    }
]

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2015-11-13
    • 2015-12-03
    • 2017-10-13
    • 2019-03-06
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多