2017-02-16 47 views
0

这是DB如何修剪MongoDB的合计结果的一个领域

{ 
    "_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,温度根据VIN和ESN字符串。还需要最新的时间戳。然后我试图使用mongo聚合方式来获得正确的结果。

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

但是,这是我的结果看起来像

{ “_id”:{ “ESN”: “B”, “阿文”: “2”}, “firstTimestamp”: NumberLong( “1485852368147”),“伏特”:[11.95,10.08,10.77,10.47,0.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.3 9,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”:[...], “温度”:[...]}

回答

1

如果您需要修剪结果,你可以使用投影和做这样的事情:

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

希望我的回答是有帮助的。

+0

我知道这一点。我只想得到伏特最后十个元素。 – wzf1943

+0

我想我得到了你的问题。请检查我的版本。 –

+0

有没有可能我最后10个元素不是第一个10?因为我发现最近十个元素是最新的10.我认为addToSet可能会保留一个链接列表。 – wzf1943

1

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

+0

谢谢,我已经弄清楚了。但是当我将查询映射到JAVA时,我遇到了一个新问题,就是ProjectionOperation没有切片这种方法。所以我不知道你是否知道这个问题。我没有配额问更多的问题 - 生活是如此艰难... – wzf1943

+0

MongoDB确实支持投影算子$ slice。 (https://docs.mongodb.com/manual/reference/operator/projection/slice/)。可能与您使用的JAVA库有关。 – CEDA