w我的mongoDB中有一些数据,如下所示。
现在我想要检索这样的数据。
按日期,环境,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。
请帮助!!
答案 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"来自"分组"的前缀名称是一个小小的聚合技巧,以进行"投影"按照您指定的顺序显示。如果使用相同的名称,则聚合引擎会将这些字段视为已存在于结果文档中,并将它们保留在字段列表的顶部。这是你以后可以利用的另一个小技巧。