这是我的收藏:
{
"Id" : "001",
"Data":[{
"updatedTime" : 1483209005,
"value" : 35
},
{
"updatedTime" : 1483209005,
"value" : 20
}
]
}
我试过了:
db.A.aggregate([
{ "$group": {
"_id": "$Id",
"Difference": {
"$sum": {
"$cond": [
{ "$eq": [ "Data.$.value", 35.0 ] },
"$updatedTime",
{ "$cond": [
{ "$eq": [ "Data.$.value", 20.0 ] },
{ "$subtract": [ 0, "$updatedTime" ] },
0
]}
]
}
}
}}
])
但我得到的输出是这样的:
{
"_id" : "001",
"Difference" : 0.0
}
我需要找出数据数组中两个updatedate字段之间的差异我该怎么做?
最佳答案
您需要使用$let
运算符将数组中的每个元素分配给一个变量,以便访问带有“点表示法”的子文档字段,可以使用$subtract
和$abs
。要获得第一个和第二个元素,只需使用$arrayElemAt
运算符。
在“in”表达式中,需要$subtract
这两个值,并使用$abs
运算符返回绝对值。
db.collection.aggregate([
{ "$group": {
"_id": "$Id",
"Difference": {
"$sum": {
"$let": {
"vars": {
"first": { "$arrayElemAt": [ "$Data", 0 ] },
"second": { "$arrayElemAt": [ "$Data", 1 ] }
},
"in": {
"$abs": {
"$subtract": [
"$$first.updatedTime",
"$$second.updatedTime"
]
}
}
}
}
}
}}
])