MongoDB - 如何按条件分组

时间:2014-04-04 20:50:45

标签: mongodb aggregation-framework

w我的mongoDB中有一些数据,如下所示。

enter image description here

现在我想要检索这样的数据。

  
    

按日期,环境,TCID分组

         

最长时间

         

选择日期,环境,TCID,状态

         

按DATE命令,TCID

  

我试过这样的事情......

{
    $group : 
    {
      _id: { DATE: "$DATE", TCID: "$TCID", ENVIRONMENT: "$ENVIRONMENT" }
      DATE: { $last : "$DATE" }
      TIME: { $last : "$TIME" }
      ENVIRONMENT: { $last : "$ENVIRONMENT" }
      TCID: { $last : "$TCID" }
      STATUS: { $last : "$STATUS" }
    }


},
{
    $sort: 
    { 
        DATE : 1,  TCID:1
    }
}

我暂时使用上述查询。它似乎有点帮助。 它只是简单地给出最后一个插入的行(假设该DATE具有最大时间)。但是,它可能并不总是正确的。

所以,我想知道如何检查最长时间。

所有列的DATA TYPE都是String。

请帮助!!

2 个答案:

答案 0 :(得分:1)

db.mycol.aggregate([
    {
      $group:
      {
       _id:{DATE:'$DATE', TCID:'$TCID', ENVIRONMENT:'$ENVIRONMENT'},
       DATE:{$addToSet:'$DATE'},
       TIME:{$addToSet:'$TIME'},
       ENVIRONMENT:{$addToSet:'$ENVIRONMENT'},
       TCID:{$addToSet:'$TCID'},
       STATUS:{$addToSet:'$STATUS'},
       TIME:{$max:'$TIME'}
     }
    },
    {$sort:{DATE: 1,TCID: 1}}
])

答案 1 :(得分:1)

通常字符串不是最适合用作值的东西,但幸运的是你的所有字符串都是" lexcially"订购,以便他们排序正确。

聚合语句的正确形式是:

db.collection.aggregate([
    { "$sort": { "DATE": 1, "TIME": 1 } },
    { "$group": {
         "_id": {
             "DATE": "$DATE", 
             "TCID": "$TCID", 
             "ENVIRONMENT": "$ENVIRONMENT"
         },
         "OTIME": { "$last": "$TIME" },
         "OSTATUS": { "$last": "$STATUS" },
    }},
    { "$project": {
        "_id": 0,
        "DATE": "$_id.DATE",
        "TIME": "$OTIME",
        "ENVIRONMENT": "$_id.ENVIRONMENT",
        "TCID": "$_id.TCID",
        "STATUS": "$OSTATUS"
    }},
    { "$sort": { "DATE": 1, "TIME": 1 } }
])

因此,让我们看一下与您尝试的不同的地方:

  • 首先在分组之前有一个$sort。通常情况下,当您打算使用$last时就是这种情况,因为您想要找到"边界"按顺序处理工作集。如果您确定文件已经按照该顺序排列,那么您可以跳过此文件。

  • 接下来是$group阶段,在您确定" TIME"之后,您可以正确使用$last。将是这个边界上最大的价值,你最重要的是希望" last"值"状态"。主要注意投影字段是如何重复的。

  • 然后你有$project,就像" SELECT" SQL中的子句。所以在这里你结合了必要的字段和"转换"分组_id中的字段到您想要的实际名称。

  • 最后,您再次来自最后一个"项目"的管道中的字段$sort。这只是确保按照您想要的顺序得到结果。

注意:有趣的" O"来自"分组"的前缀名称是一个小小的聚合技巧,以进行"投影"按照您指定的顺序显示。如果使用相同的名称,则聚合引擎会将这些字段视为已存在于结果文档中,并将它们保留在字段列表的顶部。这是你以后可以利用的另一个小技巧。