我想在执行 $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,但我不确定对于这样一个简单的案例来说它是否有点太复杂了。
谢谢,
阿米特。
最佳答案
目前无法使用聚合框架执行此操作。
您可以使用 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 不是一个很好的文本操作工具。
关于javascript - $project 上的 mongo-aggregation : apply regex grouping, 字符串处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19654711/