使用组中的通配符进行MongoDB聚合

时间:2014-03-21 18:14:15

标签: mongodb

我在MongoDB中有一组构建统计信息,我想知道我是否可以在其中一个字段上进行通配符聚合查询。

以下是一份示例文件:

    {
            "_id" : ObjectId("52deab2fe4b0a491abb54108"),
            "type" : "build",
            "time" : ISODate("2014-01-21T17:15:27.471Z"),
            "data" : {
                    "buildNumber" : 43,
                    "buildDuration" : 997308,
                    "buildProjectName" : "Mobile_February",
                    "branch" : "FEB"
                    "buildResult" : "SUCCESS"
            }
    }

我有这个查询,它将按日期和分支给我平均构建持续时间:

    db.builds.aggregate([
        { $group: { 
            _id: { 
                month: { $month: "$time" },
                day: { $dayOfMonth: "$time" },
                year: { $year: "$time" }, 
                branch: "$data.branch", 
            },
            buildDuration: { $avg: "$data.buildDuration" } 
        } },
        { $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1, "_id.branch": 1 } }
    ])

我们有几个相同类型的构建工作 - 每月一个。有一个Mobile_February,Mobile_March等。我们的其他工作也有相同的标准...... OtherJob_February,OtherJob_March等。

我想知道的是,是否有特定类型的工作运行时间更长或更短。这意味着我不会在分支上进行分组,而是在buildProjectName上进行分组,但它必须是通配符搜索才能恢复Mobile_ *和OtherJob的分组_ *

MongoDB可以实现吗?一种解决方案是添加一个新的元素名称 - 类似于“jobType”:“Mobile”,但如果有一种方式MongoDB可以使用现有数据来实现它,这似乎很浪费。

谢谢!

2 个答案:

答案 0 :(得分:0)

MongoDB聚合框架具有$substr-operator,它返回字符串的固定长度部分。它有点像黑客,但它允许你根据值的前x个字符进行分组。

db.builds.aggregate([
    { $group: { 
        _id: { 
            month: { $month: "$time" },
            day: { $dayOfMonth: "$time" },
            year: { $year: "$time" }, 
            branch: "$data.branch", 
            jobType: { $substr: [ "$data.buildProjectName", 0, 6] } // <--
        },
        buildDuration: { $avg: "$data.buildDuration" } 
    } },
    { $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1, "_id.branch": 1 } }
])

这将创建两个额外的分组&#34; JobType&#34;,在这种情况下&#34; Mobile&#34;和&#34; OtherJ&#34;

答案 1 :(得分:0)

假设您的所有工作类型长度至少为6个字符,您可以使用$substr运算符提取前6个字符并按该字段分组。例如:

> db.test.aggregate([{$project:{type:{$substr:["$data.buildProjectName", 0, 6]}}}])
{
        "result" : [
                {
                        "_id" : ObjectId("52deab2fe4b0a491abb54108"),
                        "type" : "Mobile"
                },
                {
                        "_id" : ObjectId("52deab2fe4b0a491abb54109"),
                        "type" : "OtherJ"
                }
        ],
        "ok" : 1
}