【问题标题】:Get record of another field with aggregate使用聚合获取另一个字段的记录
【发布时间】:2017-06-23 20:09:19
【问题描述】:

我是 MongoDB 世界的新手。

我在我的收藏中关注数据

{ 
    "_id" : ObjectId("5735d8d4d147aa34e440988f"), 
    "DeviceLogId" : "26962", 
    "DeviceId" : "10", 
    "UserId" : "78", 
    "LogDateTime" : ISODate("2016-05-12T07:52:44.000+0000")
}
{ 
    "_id" : ObjectId("5735d8d4d147aa34e4409890"), 
    "DeviceLogId" : "26963", 
    "DeviceId" : "10", 
    "UserId" : "342", 
    "LogDateTime" : ISODate("2016-05-12T07:54:09.000+0000")
}
{ 
    "_id" : ObjectId("5735d8d4d147aa34e4409891"), 
    "DeviceLogId" : "26964", 
    "DeviceId" : "10", 
    "UserId" : "342", 
    "LogDateTime" : ISODate("2016-05-12T07:54:10.000+0000")
}
{ 
    "_id" : ObjectId("5735d8d4d147aa34e4409892"), 
    "DeviceLogId" : "26965", 
    "DeviceId" : "10", 
    "UserId" : "78", 
    "LogDateTime" : ISODate("2016-05-12T07:54:27.000+0000")
}

我想使用 group by 查询每个用户的 DeviceId 最大 LogDateTime

我已经编写了如下查询分组,但不知道如何为每条记录获取DeviceLogId

collectionName.aggregate(
        [{
            $match: { LogDateTime: { $gt: todaysDateStart, $lt: todayDateEnd } }
        }, {
            $group: {
                _id: "$UserId",
                maxPunchTime: { $max: { $add: [ "$LogDateTime", 330*60000 ] } },
            }
        }])

在 MSSQL 中,我可以使用嵌套查询轻松完成,但我不知道如何在 MongoDB 中实现。

提前致谢。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    使用$addToSet Group Accumulator

        collectionName.aggregate(
        [{
            $match: { LogDateTime: { $gt: todaysDateStart, $lt: todayDateEnd } }
        }
        , {
            $group: {
                _id: "$UserId",
                maxPunchTime: { $max: { $add: [ "$LogDateTime", 330*60000 ] } },             
                deviceLogIds:{$addToSet: "$DeviceLogId"}  //<----
            }
        } , 
        { $sort: {"maxPunchTime" : -1} } , {$limit : 1}  //Sort Descending + Limit to 1
        ])
    

    【讨论】:

    • 我不想设置DeviceLogId。我只想要一个DeviceLogId 最大LogDateTime
    • 是的,我试过了。它给了我一个DeviceLogIDs 的数组。我不知道该选哪一个。
    • 我首先在$LogDateTime 上添加了排序(降序),然后它就起作用了。我使用$first 而不是$addToSet 来获得一条记录。它工作得很好。感谢您的帮助。
    【解决方案2】:

    在分组阶段将 deviceid 添加到数组中,

      Device:{$addToSet:deviceId} 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2021-09-17
      • 2023-02-11
      • 1970-01-01
      相关资源
      最近更新 更多