这里我们有以下查询:
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
字段的第一个字段值。
请帮助我们获取查询(如果需要,还会提供输入数据)。
我的意见是:
{
"_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"
]
}
]
}
]
}
答案 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")
}