这是我的收藏:

 {
       "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"
                            ]
                        }
                    }
                }
            }
        }
    }}
])

10-08 08:15
查看更多