当前位置: 首页 > 知识库问答 >
问题:

如何修剪MongoDB聚合结果的一个字段

赵禄
2023-03-14

这是我在数据库中的数据结构存储

{
    "_id" : ObjectId("58a4e451c164f95c98e96235"),
    "_class" : "com.contix.log.parser.log.Log",
    "vin" : "6",
    "esn" : "c",
    "volt" : 11.32,
    "internVolt" : 4.14,
    "temp" : 39.49,
    "timestamp" : NumberLong("1483375743285")
}

我想做的是根据vin和esn字符串获取最新的10个唯一伏特、internVolt和temp。还需要最新的时间戳。然后我尝试使用mongo聚合方法来获得正确的结果。

db.log.aggregate({$sort:{timestamp:-1}},{$group:{_id : {esn:"$esn",vin:"$vin"},firstTimestamp:{$first:"$timestamp"},volts:{$addToSet:"$volt"}}},{$limit:5})

但这是我的结果看起来像

{“_id" : { "”:“b”、“vin”:“2”}、“第一时间戳”: NumberLong(“1485852368147”)、“伏”:[11.95、10.08、10.77、10.47、11.41、10.36、10.96、10.75、10.39、10.53、10.1、10.22、11.16、10.11、11.87、11.33、11.82、11.78、10.25、11.86、10.5、10.41、11.3、11.31、11.97、10.64、11.57、10.93、10.02、10.68、10.9、11.53、10.46、11.42、11.73、11.32、10.19、10.51、11.35、11.28、10.65、10.21、11.18、10.91、11.43、10.52、11.34、11.1、10.99、10.61、10.28、10.97、10.3、10.3110.94、11.64、10.32、11.63、10.03、10.81、11.83、10.82、11.84、10.79、10.66、11.21、10.24、11.75、11.2]}

和其他 4 个类似的东西。

我不知道是否有任何方法可以削减$volts这种数据int组管道。$limit或$skip操作似乎用于整个文档。

我的梦想结果应该是这样的。

{“_id”:{“esn”:“b”,“vin”:“2”},“firstTimestamp”:NumberLong(“1485852368147”),“volts”:[10.81,11.83,10.82,11.84,10.79,10.66,11.21,10.24,11.75,11.2],“innerVolts”:[…],“temp”:[

共有2个答案

晏卓君
2023-03-14

您可以使用$切片修饰符将数组修剪为最后N项。

商和雅
2023-03-14

如果需要修剪结果,可以使用投影并执行以下操作:

db.log.aggregate([
         {$sort:{timestamp:-1}},
         {$group:{
                  _id : {esn:"$esn",vin:"$vin"},
                 firstTimestamp:{$first:"$timestamp"},
                 volts:{$addToSet:"$volt"},
                 innerVolts:{$addToSet:"$innerVolt"},
                 temp:{$addToSet:"$temp"}                     
          }},
          { $project: {
               _id:1,
               firstTimestamp:1,
               volts: {$slice : ["$volts",10]},
               innerVolts: {$slice : ["$innerVolts",10]}, 
               temp: {$slice:["$temp",10]}
           }}])

希望我的回答对您有所帮助。

 类似资料:
  • 本文向大家介绍MongoDB聚合分组多个结果,包括了MongoDB聚合分组多个结果的使用技巧和注意事项,需要的朋友参考一下 要聚合多个结果,请在MongoDB中使用$group。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是汇总组多个结果的查询- 这将产生以下输出-

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 在mongodb聚合调用中,如何使用$group操作符将管道中的所有文档分组为一个结果? 假设我有一组记录,看起来像这样: 我想使用聚合函数在数据库中查询在给定日期范围内注册的用户列表,并将其作为列表返回。我想要一个如下的结果: 我的查询如下所示: 到目前为止,一切顺利。我现在有一部分记录,所有记录的注册日期都在所需的范围内。但这就是我遇到麻烦的地方。现在,我想将所有这些记录分组到一个包含所有ID

  • 问题内容: 有一个对话列表,每个对话都有一个消息列表。每个消息都有一个不同的字段和一个字段。我们需要考虑的是,在对话的第一条消息中使用了动作,在几条消息中使用了动作之后,过了一会儿,依此类推(有一个聊天机器人意图列表)。 将对话的消息动作分组将类似于: 问题: 我需要使用ElasticSearch创建一个报告,该报告将返回每次会话的;接下来,我需要对类似的东西进行分组并添加一个计数;最终将导致as

  • 我是聚合框架的新手,有以下问题。 我的收藏是这样的: 用户 ActivitiesFeed 活动 聚合函数 如何使用第一个查找结果进行查找? 我查阅了activities集合。此集合保存第二个查找BaseData.UserID的id。但是使用这种方法,第二次查找没有结果。 我对activities集合进行连接的原因是actionID可以保存来自另一个集合的用户id或文档id。它取决于activiti

  • 在各种聚合管道阶段之后,我的第一个查询返回以下结果: 在各种聚合管道阶段之后,我的第二个查询返回以下结果: 这两个查询都在同一个集合上执行,但是根据管道阶段对数据进行不同的分组和转换。 我的两个查询都使用不同的条件,具有不同的管道阶段,包括和