嵌入式文档中两个值的区别

时间:2017-04-05 12:28:02

标签: mongodb mongodb-query aggregation-framework

这是我的收藏:

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

我需要找到数据阵列中两个updatedDate字段之间的差异我该怎么做?

2 个答案:

答案 0 :(得分:1)

您需要使用$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"
                            ]
                        }
                    }
                }
            }
        }
    }}
])

答案 1 :(得分:-1)

正如你所说,它总是有两个元素,然后做这样的事情 -

datetime_created = models.DateTimeField(auto_now_add=True)
datetime_updated = models.DateTimeField(auto_now=True)