MongoDB为每个组返回两个对象

MongoDB为每个组返回两个对象,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想在分组后得到两个对象$first和$last。可能吗 类似这样,但这不起作用: {“$group”:{ “_id”:“类型”, “价值观”:[{ “时间”:{“$first”:“$time”}, “值”:{“$first”:“$value”} }, { “时间”:{“$last”:“$time”}, “值”:{“$last”:“$value”} }] } } 为了使用聚合框架从数组中获取数据和值,您需要使用first将数组作为单个文档“反规范化”。还有另一个技巧可以将它们放回数组中 假设有

我想在分组后得到两个对象$first和$last。可能吗

类似这样,但这不起作用:

{“$group”:{
“_id”:“类型”,
“价值观”:[{
“时间”:{“$first”:“$time”},
“值”:{“$first”:“$value”}
}, 
{
“时间”:{“$last”:“$time”},
“值”:{“$last”:“$value”}
}]
}
}
为了使用聚合框架从数组中获取数据和值,您需要使用first将数组作为单个文档“反规范化”。还有另一个技巧可以将它们放回数组中

假设有这样一份文件

{
“类型”:“abc”,
“价值观”:[
{“时间”:ISODate(“2014-06-12T22:35:42.260Z”),“值”:“ZZZ”},
{“时间”:ISODate(“2014-06-12T22:36:45.921Z”),“值”:“KKK”},
{“时间”:ISODate(“2014-06-12T22:37:18.237Z”),“值”:“AAA”}
]
}
假设您的数组已经排序,您将执行以下操作:

如果不关心数组中的结果,请执行以下操作:

db.junk.aggregate([
{“$unwind”:“$values”},
{“$组”:{
“_id”:“$type”,
“ftime”:{“$first”:“$values.time”},
“fvalue”:{“$first”:“$values.value”},
“ltime”:{“$last”:“$values.time”},
“左值”:{“$last”:“$values.value”},
}}
])
对于数组中的这些结果,有一个技巧:

db.collection.aggregate([
{“$unwind”:“$values”},
{“$project”:{
“类型”:1,
"价值":一,,
“指示符”:{“$literal”:[“第一”、“最后”]}
}},
{“$组”:{
“_id”:“$type”,
“ftime”:{“$first”:“$values.time”},
“fvalue”:{“$first”:“$values.value”},
“ltime”:{“$last”:“$values.time”},
“左值”:{“$last”:“$values.value”},
“指标”:{“$first”:“$indicator”}
}},
{“$unwind”:“$INDICTOR”},
{“$project”:{
“价值观”:{
“时间”:{
“$cond”:[
{“$eq”:[“$indicator”,“first”]},
“$ftime”,
“$ltime”
]
},
“价值”:{
“$cond”:[
{“$eq”:[“$indicator”,“first”]},
“$fvalue”,
“$左值”
]
}
}
}},
{“$组”:{
“\u id”:“$\u id”,
“值”:{“$push”:“$values”}
}}
])
如果数组未排序,请在第一个阶段之前再放置一个阶段,以确保您的项目符合您希望和评估它们的顺序。逻辑顺序,其中是“时间”字段,因此:

{“$sort”:{“type”:1,“values.time”:1}
声明一个数组以标识“first”和“last”的值,这些值稍后将“unbound”以创建每个分组文档的两个副本。然后使用运算符对这些值进行评估,以将“值”重新分配给单个字段,最后使用将其推回到数组中

请记住,始终尝试在管道中首先使用,以便将您正在处理的文档数量减少到您合理需要的数量。您几乎不希望对整个集合执行此操作,尤其是在阵列上使用时


正如MongoDB 2.6及更高版本中引入/公开的最后一个注释一样。对于以前的版本,您可以将其与未记录的
$const
交换