这是我在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":[.. 。]}
答案 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项。