MongoDB-如何根据条件分组
我的mongoDB中有一些数据,如下所示 现在我想像这样检索数据 按日期、环境、TCID分组 最长时间 选择日期、环境、TCID、状态 按日期订购,TCID 我试过这样的东西MongoDB-如何根据条件分组,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我的mongoDB中有一些数据,如下所示 现在我想像这样检索数据 按日期、环境、TCID分组 最长时间 选择日期、环境、TCID、状态 按日期订购,TCID 我试过这样的东西 { $group : { _id: { DATE: "$DATE", TCID: "$TCID", ENVIRONMENT: "$ENVIRONMENT" } DATE: { $last : "$DATE" } TIME: { $last : "$TIME" }
{
$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
}
}
我目前正在使用上述查询。这似乎有点帮助。
它只是简单地给出最后插入的行(假设该行具有该日期的最长时间)。然而,它可能并不总是正确的
所以,我想知道如何检查最大时间
所有列的数据类型均为字符串
请帮忙 通常,字符串不是作为值使用的最佳工具,但幸运的是,所有字符串都是“按字母顺序”排序的,因此它们将正确排序
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}}
])
聚合语句的正确形式如下:
db.collection.aggregate([
{“$sort”:{“日期”:1,“时间”:1},
{“$组”:{
“_id”:{
“日期”:“$DATE”,
“TCID”:“$TCID”,
“环境”:“$ENVIRONMENT”
},
“OTIME”:{“$last”:“$TIME”},
“OSTATUS”:{“$last”:“$STATUS”},
}},
{“$project”:{
“_id”:0,
“日期”:“$\u id.DATE”,
“时间”:“$OTIME”,
“环境”:“$\u id.ENVIRONMENT”,
“TCID”:“$\u id.TCID”,
“状态”:“$OSTATUS”
}},
{“$sort”:{“日期”:1,“时间”:1}
])
让我们看看这与您尝试的不同之处:
- 首先,在你之前有一个小组。通常情况下,当您要使用时会出现这种情况,因为您希望以该顺序找到工作集的“边界”。如果您确定文档已经按照该顺序排列,则可以跳过此步骤
- 下一个阶段,在你确定“时间”将是这个边界上最大的价值之后,你正确地使用你想要的东西,你最重要的是想要“状态”的“最后”价值。请注意投影字段如何不被复制
- 然后就有了类似于SQL中的“SELECT”子句的语句。因此,在这里您可以组合所需字段,并将分组
中的字段“转换”为所需的实际名称\u id
- 最后,您将再次从上一个“项目”中仍在管道中的字段中选择。这只是确保你按照你想要的顺序得到结果
注意:来自“分组”的有趣的“O”前缀名称是一个小小的聚合技巧,可以使“投影”按指定的顺序显示。如果使用相同的名称,聚合引擎将认为这些字段已经存在于结果文档中,并将它们保留在字段列表的顶部。因此,这是您以后可以使用的另一个小技巧。日期和时间列的类型为integer或date?实际上,所有这些都是字符串。非常感谢您花了一些时间,详细说明了这一点。我从中学到了一些重要的东西。