ian*_*nks 7 mongodb mongodb-query
说我有这个:
{
"_id" : "ENVD",
"years" : [
{
"year" : "2013",
"avgInstructor" : 5.144999999999998
},
{
"year" : "2012",
"avgInstructor" : 5.194436090225564
}
]
}
Run Code Online (Sandbox Code Playgroud)
我需要能够在2012-13中找到avgInstructor字段中的差异.我以为我可以用某种方式转换键$project,这将使年份成为关键,avgInstructor评级为值.所以它看起来像这样:
{
"_id" : "ENVD",
"years" : {
"2013" : 5.144999999999998,
"2012" : 5.194436090225564
}
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?请记住,我的主要目标是能够像这个伪代码一样运行减法:years['2013'].avgInstructor - years['2013'].avgInstructor.所以如果你看到一个更简单的方法,那也会很棒.我不确定在聚合管道的上下文中最好的方法.有人可以帮忙吗?
对于最终在这里寻找使用聚合将数组转换为对象的解决方案的人来说,在更新版本的 MongoDB 中:
MongoDB 3.4.4 引入了$arrayToObject
你必须$map years
{
$set: {
years: {
$map: {
input: "$years",
as: "year",
in: [
"$$year.year",
"$$year.avgInstructor"
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
像这样
{
$set: {
years: {
$map: {
input: "$years",
as: "year",
in: [
"$$year.year",
"$$year.avgInstructor"
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用$arrayToObject
{
$set: {
years: {
$arrayToObject: "$years"
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者将两个步骤结合在一起
{
$set: {
years: {
$arrayToObject: {
$map: {
input: "$years",
as: "year",
in: [
"$$year.year",
"$$year.avgInstructor"
]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 0
一个可能的答案...
最终投影得到减去的值
db.coll.aggregate ( [
{ "$unwind" : "$years" } ,
{ $project : { "year" : "$years.year", "avgInstructor" : "$years.avgInstructor" } },
{ $sort : { "_id" : 1, "year" : 1 } },
{ $group : { "_id" : "$_id", "val_min" : { $first : "$avgInstructor" }, "val_max" : { $last : "$avgInstructor" } } },
{ $project : { "diff" : { $subtract : [ "$val_min", "$val_max" ] } } }
] )
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
980 次 |
| 最近记录: |