2016-03-16 38 views
-1

我在我的收藏中有很多像下面这样的测试文档。

{ 
    "_id" : ObjectId("56e2c5a0d36c55593b74ada5"), 
    "priority" : "P1", 
    "key" : "IN94909", 
    "days" : 21.8344046180556 
} 

{ 
    "_id" : ObjectId("56e2c5a0d36c55593b74ada5"), 
    "priority" : "P2", 
    "key" : "IN94904", 
    "days" : 35.8344046180556 
} 

{ 
    "_id" : ObjectId("56e2c5a0d36c55593b74ada5"), 
    "priority" : "P3", 
    "key" : "IN95409", 
    "days" : 5.8344046180556 
} 

我想通过“P1”,“P2”和“P3”仅在“天”已经超过了一些SLA分组的所有文档。现在P1,P2和P3的SLA是不同的。

我的结果集应该只包含超过SLA的结果集。假设P1的SLA为5天,P2为10天,P3为15天。

+1

您能否简单说明'P0的SLA为5天,P1为10天,P3为15天。 – zangw

+0

对不起,我没有看到关于这个问题的不清楚。这对我来说非常有意义,我的回答正是发布的想法。 – Derick

回答

2

这最好通过聚合系统完成。

的第一步是选择所有文件,其中SLA已过期:

db.collection.aggregate([ 
    { $match: { $or: [ 
     { priority: 'P1', days : { $gt: 5 } }, 
     { priority: 'P2', days : { $gt: 10 } }, 
     { priority: 'P3', days : { $gt: 15 } } 
    ] } }, 

然后你可以按每个优先级与小组赛:

{ $group: { 
     _id: '$priority', 

并添加每个文件:

 docs: { $push: '$$ROOT' } 
    } } 

,并关闭聚合:

]); 
+0

真棒Derick!这正是我所期待的,它解决了我的问题。对不起,如果我的问题不清楚,但你回答得很直白! – svg

+0

@ user2983266,你似乎是StackOverflow的新手。一般来说,如果你认为和回答回答你的问题,你应该“接受”它(用大勾)。 – Derick

+0

是的,最近开始积极使用它!现在我已经接受了,谢谢! – svg