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

时间:2017-02-16 03:59:49

标签: mongodb mongodb-query aggregation-framework

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

{
    "_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")
}

我想要做的是获得最新的10个独特伏特,internVolt,temp基于vin和esn String。还需要最新的时间戳。然后我尝试使用mongo聚合方式来获得正确的结果。

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

但这是我的结果看起来像

  

{" _id" :{" esn" :" b"," vin" :" 2" }," firstTimestamp" :   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.31, 11.81,11.8,10.42,11.51,10.72,11.39,10.69,11.27,11.11,10.15,10.78,10.58,11.49,10.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"),"伏特" :[10.81,11.83,10.82,11.84,10.79,10.66,11.21,10.24,11.75,11.2]," innerVolts":[...]," temp":[.. 。]}

2 个答案:

答案 0 :(得分:2)

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

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]}
           }}])

希望我的回答很有帮助。

答案 1 :(得分:1)

您可以使用$slice修饰符将数组修剪为最新的N项。