假设我有这个:
{
"_id" : "ENVD",
"years" : [
{
"year" : "2013",
"avgInstructor" : 5.144999999999998
},
{
"year" : "2012",
"avgInstructor" : 5.194436090225564
}
]
}
我需要能够找到 2012-13 年 avgInstructor 字段的差异。我在想我可以使用 $project
以某种方式转换键,这将使年份成为键,而 avgInstructor 评级是值。所以它看起来像这样:
{
"_id" : "ENVD",
"years" : {
"2013" : 5.144999999999998,
"2012" : 5.194436090225564
}
}
这可能吗?请记住,我的主要目标是能够像这样的伪代码运行减法:years['2013'].avgInstructor - years['2013'].avgInstructor
。因此,如果您看到更简单的方法,那也很棒。我不确定在聚合管道的上下文中解决此问题的最佳方法。有人可以帮忙吗?
最佳答案
对于最终在这里寻找解决方案以在更新版本的 MongoDB 中使用聚合将数组转换为对象的人:
MongoDB 3.4.4 引入 $arrayToObject
你必须 $map 年
{
$set: {
years: {
$map: {
input: "$years",
as: "year",
in: [
"$$year.year",
"$$year.avgInstructor"
]
}
}
}
}
变成这样
{
"_id" : "ENVD",
"years": [
["2013", 5.144999999999998],
["2012", 5.194436090225564]
]
}
然后使用 $arrayToObject
{
$set: {
years: {
$arrayToObject: "$years"
}
}
}
或者将这两个步骤结合在一起
{
$set: {
years: {
$arrayToObject: {
$map: {
input: "$years",
as: "year",
in: [
"$$year.year",
"$$year.avgInstructor"
]
}
}
}
}
}
关于mongodb - 来自 MongoDB 中值的动态键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033014/