Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-如何根据条件分组_Mongodb_Aggregation Framework - Fatal编程技术网

MongoDB-如何根据条件分组

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" }

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

现在我想像这样检索数据

按日期、环境、TCID分组

最长时间

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

按日期订购,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
    }
}
我目前正在使用上述查询。这似乎有点帮助。 它只是简单地给出最后插入的行(假设该行具有该日期的最长时间)。然而,它可能并不总是正确的

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

所有列的数据类型均为字符串


请帮忙

通常,字符串不是作为值使用的最佳工具,但幸运的是,所有字符串都是“按字母顺序”排序的,因此它们将正确排序

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?实际上,所有这些都是字符串。非常感谢您花了一些时间,详细说明了这一点。我从中学到了一些重要的东西。