MongoDB显示每个用户每天的第一个和最后一个事件
每次用户登录或注销时,mongo中都会保存一个事件。用户每天可以多次登录和/或注销 例如,Bob登录2次,注销1次:MongoDB显示每个用户每天的第一个和最后一个事件,mongodb,mongodb-query,Mongodb,Mongodb Query,每次用户登录或注销时,mongo中都会保存一个事件。用户每天可以多次登录和/或注销 例如,Bob登录2次,注销1次: { username: ‘bob’, type: ‘login’, eventDate: ISODate(‘2018-09-21T12:39:50.676Z’) } { username: ‘bob’, type: ‘login’, eventDate: ISODate(‘2018-09-21T13:55:50.676Z’) } { usernam
{
username: ‘bob’,
type: ‘login’,
eventDate: ISODate(‘2018-09-21T12:39:50.676Z’)
}
{
username: ‘bob’,
type: ‘login’,
eventDate: ISODate(‘2018-09-21T13:55:50.676Z’)
}
{
username: ‘bob’,
type: ‘logout,
eventDate: ISODate(‘2018-09-21T22:10:50.676Z’)
}
James只有一个登录事件:
{
username: ‘james’,
type: ‘login,
eventDate: ISODate(‘2018-09-21T10:10:50.676Z’)
}
我想执行一个查询,检索每个用户每天的当天第一次登录和当天最后一次注销(比如在过去一周内)
因此,结果将是:
[{
username: ‘bob’,
firstLogin: ISODate(‘2018-09-21T12:39:50.676Z’),
lastLogout: ISODate(‘2018-09-21T22:10:50.676Z’)
}
{
username: ‘james’,
firstLogin: ISODate(‘2018-09-22T10:19:50.676Z’),
lastLogout: null,
}]
我相信我必须处理“聚合”,但不确定。使用两个级别的
$group
:(MongoDB V3.2.18)
我相信用户名是独一无二的
$sort
eventDate首先$group
按用户名和键入$project
来区分第一次登录和最后登录$group
再次使用用户名查看最终结果输出:
/* 1 */
{
"_id" : "james",
"firstLogin" : ISODate("2018-09-21T10:10:50.676Z"),
"lastLogout" : null
}
/* 2 */
{
"_id" : "bob",
"firstLogin" : ISODate("2018-09-21T12:39:50.676Z"),
"lastLogout" : ISODate("2018-09-21T22:10:50.676Z")
}
通过使用两个级别的
$group
:(MongoDB V3.2.18)
我相信用户名是独一无二的
$sort
eventDate首先$group
按用户名和键入$project
来区分第一次登录和最后登录$group
再次使用用户名查看最终结果输出:
/* 1 */
{
"_id" : "james",
"firstLogin" : ISODate("2018-09-21T10:10:50.676Z"),
"lastLogout" : null
}
/* 2 */
{
"_id" : "bob",
"firstLogin" : ISODate("2018-09-21T12:39:50.676Z"),
"lastLogout" : ISODate("2018-09-21T22:10:50.676Z")
}
您可以通过单个
组来实现
当同一用户有不同的工作日时也可以工作
通过键入返回上一个和第一个日期
在MongoDB GUI上测试
您可以通过单个组来实现
当同一用户有不同的工作日时也可以工作
通过键入返回上一个和第一个日期
在MongoDB GUI上测试
您应该使用$max
查找上次注销的值。是的,谢谢。由mistak提供。您应该使用$max
查找上次注销的值。是的,谢谢。这是错的。
db.getCollection("loginDetail").aggregate([
{
$group: {
_id: {
username: "$username",
year: { $year: "$eventDate" },
month: { $month: "$eventDate" },
day: { $dayOfMonth: "$eventDate" }
},
firstLogin: {
$min: {
$cond: [{ $and: [{ $eq: ["$type", "login"] }] }, "$eventDate", null]
}
},
lastLogout: {
$max: {
$cond: [{ $and: [{ $eq: ["$type", "logout"] }] }, "$eventDate", null]
}
}
}
},
{
$project: {
_id: 1,
username : '$_id.username',
firstLogin :1,
lastLogout :1
}
}
]);