【问题标题】:What is wrong with this MongoDB Aggregate?这个 MongoDB 聚合有什么问题?
【发布时间】:2017-04-19 06:18:15
【问题描述】:

这是我的示例文档。我有很多这样的文档,其中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。它们似乎不适合我。 我哪里错了,或者我错过了什么。

$group 之后尝试了$match

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

没有用。

【问题讨论】:

    标签: mongodb meteor mongodb-query aggregation-framework


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      相关资源
      最近更新 更多