聚合查询问题

时间:2017-01-18 09:48:37

标签: mongodb mongodb-query aggregation-framework

这里我们有以下查询:

db.getCollection('triggered_policies').aggregate(
[{ "$match" : { "policy_name" : "EIQSVCFG-2111-Spam Activity"}}, 
{ "$project" : { "cust_created_at" : { "$add" : [ "$created_at" , 19800000]} , "event_ids" : "$event_ids" , "trigger_time" : "$trigger_time" , "created_at" : "$created_at" , "triggered_rules" : "$triggered_rules"}},
{ "$sort" : { "created_at" : -1}},
{ "$group" : 
    { "_id" : 
        { 
            "$hour" : "$cust_created_at"} , 
            "triggered_policies" : { "$addToSet" : { "trigger_time" : "$trigger_time" , "created_at" : "$created_at" , "event_ids" : "$event_ids" , "triggered_rules" : "$triggered_rules"}
        }
    }
}, 
{ "$sort" : { "_id" : 1}}
])

以上查询的输出为:

{
    "_id" : 11,
    "triggered_policies" : [ 
        {
            "trigger_time" : NumberLong(1484633489000),
            "created_at" : ISODate("2017-01-17T06:11:05.452Z"),
            "event_ids" : [ 
                "000159ab0c6c3c722f6249", 
                "000159ab0c6c3b722f624a"
            ],
            "triggered_rules" : [ 
                {
                    "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
                    "trigger_time" : NumberLong(1484633489000),
                    "event_ids" : [ 
                        "000159ab0c6c3c722f6249", 
                        "000159ab0c6c3b722f624a"
                    ]
                }
            ]
        }, 
        {
            "trigger_time" : NumberLong(1484633489000),
            "created_at" : ISODate("2017-01-17T06:11:05.453Z"),
            "event_ids" : [ 
                "000159ab0c6c3c722f6249", 
                "000159ab0c6c3b722f624a"
            ],
            "triggered_rules" : [ 
                {
                    "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
                    "trigger_time" : NumberLong(1484633489000),
                    "event_ids" : [ 
                        "000159ab0c6c3c722f6249", 
                        "000159ab0c6c3b722f624a"
                    ]
                }
            ]
        }, 
        {
            "trigger_time" : NumberLong(1484633489000),
            "created_at" : ISODate("2017-01-17T06:11:05.454Z"),
            "event_ids" : [ 
                "000159ab0c6c3c722f6248", 
                "000159ab0c6c3b722f624b"
            ],
            "triggered_rules" : [ 
                {
                    "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
                    "trigger_time" : NumberLong(1484633489000),
                    "event_ids" : [ 
                        "000159ab0c6c3c722f6248", 
                        "000159ab0c6c3b722f624b"
                    ]
                }
            ]
        }
    ]
}

但我们期待的是:

在上面的查询中,我们删除了以下字段组合的重复值:

 - trigger_time
 - created_at
 - event_ids
 - triggered_rules

但我们需要具有以下三个字段的唯一值:

 - trigger_time
 - event_ids
 - triggered_rules

created_at字段的第一个字段值。

即,预期的输出结果附在下面的图像中:enter image description here

请帮助我们获取查询(如果需要,还会提供输入数据)。

我的意见是:

{
    "_id" : ObjectId("587db579a7c554598e3bb56e"),
    "policy_name" : "EIQSVCFG-2111-Spam Activity",
    "event_ids" : [ 
        "000159ab0c6c3c722f6249", 
        "000159ab0c6c3b722f624a"
    ],
    "trigger_time" : NumberLong(1484633489000),
    "created_at" : ISODate("2017-01-17T06:11:05.452Z"),
    "triggered_rules" : [ 
        {
            "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
            "trigger_time" : NumberLong(1484633489000),
            "event_ids" : [ 
                "000159ab0c6c3c722f6249", 
                "000159ab0c6c3b722f624a"
            ]
        }
    ]
}


{
    "_id" : ObjectId("587f0801a34837e4ff3c5deb"),
    "policy_name" : "EIQSVCFG-2111-Spam Activity",
    "event_ids" : [ 
        "000159ab0c6c3c722f6249", 
        "000159ab0c6c3b722f624a"
    ],
    "trigger_time" : NumberLong(1484633489000),
    "created_at" : ISODate("2017-01-17T06:11:05.452Z"),
    "triggered_rules" : [ 
        {
            "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
            "trigger_time" : NumberLong(1484633489000),
            "event_ids" : [ 
                "000159ab0c6c3c722f6249", 
                "000159ab0c6c3b722f624a"
            ]
        }
    ]
}


{
    "_id" : ObjectId("587f0807a34837e4ff3c5dec"),
    "policy_name" : "EIQSVCFG-2111-Spam Activity",
    "event_ids" : [ 
        "000159ab0c6c3c722f6249", 
        "000159ab0c6c3b722f624a"
    ],
    "trigger_time" : NumberLong(1484633489000),
    "created_at" : ISODate("2017-01-17T06:11:05.452Z"),
    "triggered_rules" : [ 
        {
            "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
            "trigger_time" : NumberLong(1484633489000),
            "event_ids" : [ 
                "000159ab0c6c3c722f6249", 
                "000159ab0c6c3b722f624a"
            ]
        }
    ]
}


{
    "_id" : ObjectId("587f0811a34837e4ff3c5ded"),
    "policy_name" : "EIQSVCFG-2111-Spam Activity",
    "event_ids" : [ 
        "000159ab0c6c3c722f6249", 
        "000159ab0c6c3b722f624a"
    ],
    "trigger_time" : NumberLong(1484633489000),
    "created_at" : ISODate("2017-01-17T06:11:05.452Z"),
    "triggered_rules" : [ 
        {
            "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
            "trigger_time" : NumberLong(1484633489000),
            "event_ids" : [ 
                "000159ab0c6c3c722f6249", 
                "000159ab0c6c3b722f624a"
            ]
        }
    ]
}


{
    "_id" : ObjectId("587f0861a34837e4ff3c5dee"),
    "policy_name" : "EIQSVCFG-2111-Spam Activity",
    "event_ids" : [ 
        "000159ab0c6c3c722f6249", 
        "000159ab0c6c3b722f624a"
    ],
    "trigger_time" : NumberLong(1484633489000),
    "created_at" : ISODate("2017-01-17T06:11:05.453Z"),
    "triggered_rules" : [ 
        {
            "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
            "trigger_time" : NumberLong(1484633489000),
            "event_ids" : [ 
                "000159ab0c6c3c722f6249", 
                "000159ab0c6c3b722f624a"
            ]
        }
    ]
}


{
    "_id" : ObjectId("587f2932a34837e4ff3c5def"),
    "policy_name" : "EIQSVCFG-2111-Spam Activity",
    "event_ids" : [ 
        "000159ab0c6c3c722f6248", 
        "000159ab0c6c3b722f624b"
    ],
    "trigger_time" : NumberLong(1484633489000),
    "created_at" : ISODate("2017-01-17T06:11:05.454Z"),
    "triggered_rules" : [ 
        {
            "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
            "trigger_time" : NumberLong(1484633489000),
            "event_ids" : [ 
                "000159ab0c6c3c722f6248", 
                "000159ab0c6c3b722f624b"
            ]
        }
    ]
}

预计会出现:

{
    "_id" : 11,
    "triggered_policies" : [ 
        {
            "trigger_time" : NumberLong(1484633489000),
            "created_at" : ISODate("2017-01-17T06:11:05.452Z"),
            "event_ids" : [ 
                "000159ab0c6c3c722f6249", 
                "000159ab0c6c3b722f624a"
            ],
            "triggered_rules" : [ 
                {
                    "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
                    "trigger_time" : NumberLong(1484633489000),
                    "event_ids" : [ 
                        "000159ab0c6c3c722f6249", 
                        "000159ab0c6c3b722f624a"
                    ]
                }
            ]
        }, 
        {
            "trigger_time" : NumberLong(1484633489000),
            "created_at" : ISODate("2017-01-17T06:11:05.454Z"),
            "event_ids" : [ 
                "000159ab0c6c3c722f6248", 
                "000159ab0c6c3b722f624b"
            ],
            "triggered_rules" : [ 
                {
                    "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
                    "trigger_time" : NumberLong(1484633489000),
                    "event_ids" : [ 
                        "000159ab0c6c3c722f6248", 
                        "000159ab0c6c3b722f624b"
                    ]
                }
            ]
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

<强>被修改

您提供的输出不符合您的要求,因为两个文档中的trigger_time字段是相同的,而您需要它们是唯一的。 因此,以下聚合满足您提供的要求。

db.getCollection('triggered_policies').aggregate([
  { $match : { "policy_name" : "EIQSVCFG-2111-Spam Activity"}},
  { $project : { created_at : { $add : [ "$created_at" , 19800000]}, triggered_rules:1, trigger_time:1, event_ids:1}},

  { $sort : { "created_at" : -1}}, 
  { $unwind:"$triggered_rules"}, //this will unwind the array of triggered_rules
  { $group:{_id:"$triggered_rules", created_at: {$first: "$created_at"}, event_ids: {$first: "$event_ids"}, trigger_time: {$first: "$trigger_time"}}}, //this will give unique triggered_rules
  { $project : { created_at : 1, triggered_rules:"$_id", trigger_time:1, event_ids:1}},

  { $group:{_id:"$event_ids", created_at: {$first: "$created_at"}, trigger_time: {$first: "$trigger_time"}, triggered_rules: {$first: "$triggered_rules"}}}, //will give unique event_ids field
  { $project : { created_at : 1, triggered_rules:1, trigger_time:1, event_ids:"$_id"}},

  //and finally making unique created_at and trigger_time fileds
  { $group:{_id:"$created_at", trigger_time: {$first: "$trigger_time"}, event_ids: {$first: "$event_ids"}, triggered_rules:    {$first: "$triggered_rules"}}}, //this will give you unique created_at fields
  { $project : { created_at : "$_id", triggered_rules:1, trigger_time:1, event_ids:1}},
  { $group:{_id:"$trigger_time", created_at: {$first: "$created_at"}, event_ids: {$first: "$event_ids"}, triggered_rules: {$first: "$triggered_rules"}}}, //and this will give you unique trigger_time fields    
  { $project : { created_at : 1, triggered_rules:1, trigger_time:"$_id", event_ids:1}},

])

根据您提供的输入,这给出了以下输出:

{
"_id" : NumberLong("1484633489000"),
"created_at" : ISODate("2017-01-17T11:41:05.453Z"),
"event_ids" : [
    "000159ab0c6c3c722f6249",
    "000159ab0c6c3b722f624a"
],
"triggered_rules" : {
    "policy_rule" : ObjectId("58776ea2a7c5541661c0424c"),
    "trigger_time" : NumberLong("1484633489000"),
    "event_ids" : [
        "000159ab0c6c3c722f6249",
        "000159ab0c6c3b722f624a"
    ]
},
"trigger_time" : NumberLong("1484633489000")
}