3

我想在做 $project 时应用一些简单的字符串操作,是否可以在 $project 上应用类似以下函数的东西?:

var themeIdFromZipUrl = function(zipUrl){
    return zipUrl.match(/.*\/(T\d+)\/.*/)[1]
};

我正在使用以下查询:

db.clientRequest.aggregate(
{
$match: {
  "l": {$regex: ".*zip"},
  "t": { "$gte": new Date('1/SEP/2013'),
                    "$lte": new Date('7/OCT/2013')
                    }
  }
},
{
  $project: {"theme_url" : "$l", "_id": 0, "time": "$t"}
},
{
  $group: {   _id: {
                      theme_url: "$theme_url",
                      day: {
                              "day": {$dayOfMonth : "$time"},
                              "month": {$month: "$time"},
                              "year": {$year: "$time"}
                            },
              },
              count: {$sum:1}
  }
}

)

这将返回以下内容:

        {
        "_id" : {
            "theme_url" : "content/theme/T70/zip",
            "day" : {
                "day" : 13,
                "month" : 9,
                "year" : 2013
            }
        },
        "count" : 2
    }

我可以在现场应用上述功能theme_url并将其转换为theme_id吗?我看了一点 Map-Reduce,但我不确定对于这样一个简单的案例是否有点太复杂了。

谢谢,

阿米特。

4

1 回答 1

1

目前没有办法使用聚合框架来做到这一点。

您可以使用 MapReduce 来完成,但这可能会减慢整个过程(如果数据量很大)。

如果这是聚合的最后一步,您也可以在聚合完成后在客户端执行此操作。例如在 Mongo shell 中:

var aggregationResults = col.aggregate([ /* aggregation pipeline here */]);
aggregationResults.results.forEach(function(x) { 
  x._id.theme_id = themeIdFromUrl(x._id.themeUrl);
});

当然,如果您使用其他语言的驱动程序,则必须以您使用的任何语言执行此操作。

一般来说,如果您的数据包含 theme_url 并且 theme_id 编码在 URL 中,则将其存储在自己的字段中可能是有意义的。Mongo 不是一个很好的文本操作工具。

于 2014-01-28T07:18:06.097 回答