这个MongoDB Aggregate有什么问题?

时间:2016-12-04 22:19:21

标签: mongodb meteor mongodb-query aggregation-framework

这是我的示例文档。我有很多这样的文档,其中Cpe.Srno是关键,Cpe.date使用Api持续更新

{
    "_id": "8NH5rNCz47fyoo3z2",
    "Cpe": {
        "Srno": "GZDBDt2NmpMv54j",
        "date": { 
            "$date": "2016-12-04T14:51:26.452Z" 
        }
    },
    "serialNumber": 4.703961341e+09,
    "Device": {
        "object_id": 1,
        "terminal_id": 3,
        "Info": { 
            "FirmwareVersion": { 
                "value": "5.9.2"
            },
            "Model": {
                "value": "lunus    Rustic HRK   paxton -  989"
            },
            "DeviceSerialNumber": {
               "value": 3.830919496e+09
            },
            "BatteryType": {
               "value": "Handcrafted  lithium  battery"
            },
            "SavedPriority": { 
                "value": 7 
            }
        }
    }
}

我正在尝试按Cpe.Srno进行分组,并使用Cpe.date获取最新文档。所以我得到了明确的Cpe.Srno,只有最新的文档。

我被困在小组赛阶段。这是我的代码

db.AllDevices.aggregate([
    { $sort: { "Cpe.date": -1 } },
    {
        $group: {
            _id: "$Cpe.Srno",
            "latest": { $first: "$Cpe.date" }
        }
    },
])

这是我的结果

{ "_id" : "qst3pnS3EQi8uHb", "latest" : ISODate("2016-12-04T14:51:26.487Z") }
{ "_id" : "Ur45SS1I3Yaji2p", "latest" : ISODate("2016-12-04T14:51:26.513Z") }
{ "_id" : "9ZZXVVEAQ5pA9Ax", "latest" : ISODate("2016-12-04T14:51:26.518Z") }

我需要获取整个数据,所有字段(我只有两个字段)。我检查了$ push,$addToSet。它们似乎不适合我。 我哪里错了,或者我错过了什么。

$match

之后尝试$group
db.AllDevices.aggregate([
    { $sort: { "Cpe.date": -1 } },
    {
        $group: {
            _id: "$Cpe.Srno",
            "latest": { $first: "$Cpe.date" }
        }
    },
    {
        $project: {
            Srno: "$_id",
            datetag: "$latest",
            _id: 0
        }
    },
    { $match: { "Cpe.Srno": "$Srno", "Cpe.date": "$datetag" } }
])

不起作用。

1 个答案:

答案 0 :(得分:0)

您可以使用 $$ROOT 来推送整个文档,然后使用 $arrayElemAt 选择最新的。

aggregate([{
    $sort: {
        "Cpe.date": -1
    }
}, {
    $group: {
        _id: "$Cpe.Srno",
        "fields": {
            $push: "$$ROOT"
        }
    }
}, {
    $project: {
        "latest": {
            $arrayElemAt: ["$fields", 0]
        }
    }
}])