MongoDB文档重新成形

MongoDB文档重新成形,mongodb,aggregation-framework,Mongodb,Aggregation Framework,这个问题来自(就像我通常做的那样)仔细阅读某某提出的问题,为我自己提出了另一个问题。因此,除了努力解决问题的学习练习外,我发现还会出现另一个问题,比如这个 迄今为止,OP仍不接受这一结果,事实上,对于“他们”想要实现的目标,也没有得到澄清。但我确实给出了我的解释,以达成解决方案的简单和长两种形式 最后,这个过程让我想知道,考虑到解决方案的long形式,在下一个MongoDB发行版(目前预计为2.6版)中,是否会引入一些新功能,使用已经引入的其他聚合操作符 因此,情况如下: 样本文件 { “跟踪项

这个问题来自(就像我通常做的那样)仔细阅读某某提出的问题,为我自己提出了另一个问题。因此,除了努力解决问题的学习练习外,我发现还会出现另一个问题,比如这个

迄今为止,OP仍不接受这一结果,事实上,对于“他们”想要实现的目标,也没有得到澄清。但我确实给出了我的解释,以达成解决方案的简单两种形式

最后,这个过程让我想知道,考虑到解决方案的long形式,在下一个MongoDB发行版(目前预计为2.6版)中,是否会引入一些新功能,使用已经引入的其他聚合操作符

因此,情况如下:

样本文件
{
“跟踪项目类型”:“软件”,
“跟踪项目名称”:“Word”,
“持续时间”:9540
}
{
“跟踪项目类型”:“软件”,
“跟踪项目名称”:“Excel”,
“持续时间”:4000
}
{
“跟踪项目类型”:“软件”,
“跟踪的项目名称”:“记事本”,
“持续时间”:4000
}
{
“跟踪项目类型”:“站点”,
“跟踪的项目名称”:“Facebook”,
“持续时间”:7920
}
{
“跟踪项目类型”:“站点”,
“跟踪的项目名称”:“推特”,
“持续时间”:5555
}
{
“跟踪项目类型”:“站点”,
“追踪物品名称”:“数字亵渎”,
“持续时间”:8000
}
期望结果 前两名按每种类型排序,按总持续时间排序。尽管这是一个小样本,但持续时间被认为是许多项目的一笔金额

{
“跟踪项目类型”:“站点”,
“追踪物品名称”:“数字亵渎”,
“持续时间”:8000
}
{ 
“跟踪项目类型”:“站点”,
“跟踪的项目名称”:“Facebook”,
“持续时间”:7920
}
{ 
“跟踪项目类型”:“软件”,
“跟踪项目名称”:“Word”,
“持续时间”:9540
}
{ 
“跟踪项目类型”:“软件”,
“跟踪的项目名称”:“记事本”,
“持续时间”:4000
}
聚合溶液 这是我解决这个问题的冗长方法

db.collection.aggregate([
//关于持续时间的类型和“总和”的分组
{“$组”:{
“_id”:{
“跟踪的项目类型”:“$tracked\u item\u type”,
“跟踪的项目名称”:“$tracked\u item\u name”
},
“持续时间”:{“$sum”:“$duration”}
}},
//按类型和持续时间降序排序
{“$sort”:{“\u id.tracked\u item\u type”:1,“duration”:-1},
/*有趣的部分*/
//将结果重新塑造为“站点”和“软件”阵列
{“$group”:{
“_id”:空,
“站点”:{“$push”:
{“$cond”:[
{“$eq”:[“$\u id.tracked\u item\u type”,“Site”]},
{“\u id”:“$\u id”,“duration”:“$duration”},
无效的
]}
},
“软件”:{“$push”:
{“$cond”:[
{“$eq”:[“$\u id.tracked\u item\u type”,“Software”]},
{“\u id”:“$\u id”,“duration”:“$duration”},
无效的
]}
}
}},
//删除“软件”的空值
{“$unwind”:“$software”},
{“$match”:{“software”:{“$ne”:null}}},
{“$group”:{
“\u id”:“$\u id”,
“软件”:{“$push”:“$software”},
“站点”:{“$first”:“$sites”}
}},
//删除“站点”的空值
{“$unwind”:“$sites”},
{“$match”:{“sites”:{“$ne”:null}},
{“$group”:{
“\u id”:“$\u id”,
“软件”:{“$first”:“$software”},
“站点”:{“$push”:“$sites”}
}},
//投影出软件并限制到*top*2结果
{“$unwind”:“$software”},
{“$project”:{
“_id”:0,
“_id”:{“_id”:“$software._id”,“duration”:“$software.duration”},
“站点”:“$sites”
}},
{“$limit”:2},
//将多个软件按键分组的项目站点需要排序
//然后限制*top*2结果
{“$unwind”:“$sites”},
{“$组”:{
“_id”:{“_id”:“$sites._id”,“duration”:“$sites.duration”},
“软件”:{“$push”:“$\u id”}
}},
{“$sort”:{“\u id.duration”:-1},
{“$limit”:2}
])
“还没有完全实现”输出 以及聚合未达到最终结果的点。至少按照我目前的理解

{
“结果”:[
{
“_id”:{
“_id”:{
“跟踪项目类型”:“站点”,
“追踪物品名称”:“数字亵渎”
},
“持续时间”:8000
},
“软件”:[
{
“_id”:{
“跟踪项目类型”:“软件”,
“跟踪的项目名称”:“Word”
},
“持续时间”:9540
},
{
“_id”:{
“跟踪项目类型”:“软件”,
“跟踪的项目名称”:“记事本”
},
“持续时间”:4000
}
]
},
{
“_id”:{
“_id”:{
“跟踪项目类型”:“站点”,
“跟踪的项目名称”:“Facebook”
},
“持续时间”:7920
},
“软件”:[
{
“_id”:{
“跟踪项目类型”:“软件”,
“跟踪的项目名称”:“Word”
},
“持续时间”:9540
},
{
“_id”:{
“跟踪项目类型”:“软件”,
“跟踪的项目名称”:“记事本”
},
“持续时间”:4000
}
var pregroup = { "$group" : {
        "_id" : {
            "type" : "$tracked_item_type",
            "name" : "$tracked_item_name"
        },
        "duration" : {
            "$sum" : "$duration"
        }
    }
};
var sort = { "$sort" : { "_id.type" : 1, "duration" : -1 } };
var group1 = { "$group" : {
        "_id" : "$_id.type",
        "num1" : {
            "$first" : {
                "name" : "$_id.name",
                "dur" : "$duration"
            }
        },
        "other" : {
            "$push" : {
                "name" : "$_id.name",
                "dur" : "$duration"
            }
        },
    "all" : {
        "$push" : {
            "name" : "$_id.name",
            "dur" : "$duration"
        }
    }
    }
};
var unwind = { "$unwind" : "$other" };
project = {
    "$project" : {
        "keep" : {
            "$ne" : [
                "$num1.name",
                "$other.name"
            ]
        },
        "num1" : 1,
        "all" : 1,
        "other" : 1
    }
};
var match = { "$match" : { "keep" : true } };
var sort2 = { "$sort" : { "_id" : 1, "other.dur" : -1 } };
var group2 = { "$group" : {
        "_id" : "$_id",
        "numberOne" : {
            "$first" : "$num1"
        },
        "numberTwo" : {
            "$first" : "$other"
        },
    "all" : {
        "$first" : "$all"
    }
    }
};
unwind2 = { "$unwind" : "$all" };
project2 = { "$project" : {
    "_id" : 0,
    "tracked_item_type" : "$_id",
    "tracked_item_name" : {
        "$cond" : [
            {
                "$or" : [
                    {
                        "$eq" : [
                            "$all.name",
                            "$numberOne.name"
                        ]
                    },
                    {
                        "$eq" : [
                            "$all.name",
                            "$numberTwo.name"
                        ]
                    }
                ]
            },
            "$all.name",
            null
        ]
    },
    "duration" : {
        "$cond" : [
            {
                "$or" : [
                    {
                        "$eq" : [
                            "$all.name",
                            "$numberOne.name"
                        ]
                    },
                    {
                        "$eq" : [
                            "$all.name",
                            "$numberTwo.name"
                        ]
                    }
                ]
            },
            "$all.dur",
            null
        ]
    }
}
}
match2 = { "$match" : { "tracked_item_name" : { "$ne" : null } } };
db.top2.aggregate(pregroup, sort, group1, unwind, project, match, sort2, group2, unwind2, project2, match2).toArray()
[
    {
        "tracked_item_type" : "Software",
        "tracked_item_name" : "Word",
        "duration" : 9540
    },
    {
        "tracked_item_type" : "Software",
        "tracked_item_name" : "Notepad",
        "duration" : 4000
    },
    {
        "tracked_item_type" : "Site",
        "tracked_item_name" : "Digital Blasphemy",
        "duration" : 8000
    },
    {
        "tracked_item_type" : "Site",
        "tracked_item_name" : "Facebook",
        "duration" : 7920
    }
]