gpt4 book ai didi

java - 如何使用Java驱动程序在MongoDB中按用户名获取每个用户组的最后一个文档?

转载 作者:太空宇宙 更新时间:2023-11-04 11:05:09 26 4
gpt4 key购买 nike

我创建了一个集合来跟踪用户 session 。我想根据登录时间获取每个用户的最后一次 session 。假设我的 Collection 中有一些文档。

{
"_id" : BinData(3,"LkNkGFrvldtTyHmLp5CirA=="),
"createdTime" : ISODate("2017-09-22T06:37:17.620Z"),
"userName" : "testUser1",
"loggedOnDuration" : NumberLong(10),
"loginTime" : ISODate("2017-09-22T06:37:17.620Z"),
"logoutTime" : ISODate("2017-09-23T06:37:17.620Z"),
}
{
"_id" : BinData(3,"B0R7SkeZ30rCjsp/Kftphw=="),
"createdTime" : ISODate("2017-09-22T06:42:17.620Z"),
"userName" : "testUser1",
"loggedOnDuration" : NumberLong(10),
"loginTime" : ISODate("2017-09-22T06:42:17.620Z"),
"logoutTime" : ISODate("2017-09-23T06:37:17.620Z"),
}
{
"_id" : BinData(3,"B0R7SkeZ30rCjsp/Kftphw=="),
"createdTime" : ISODate("2017-09-22T06:45:17.620Z"),
"userName" : "testUser2",
"loggedOnDuration" : NumberLong(10),
"loginTime" : ISODate("2017-09-22T06:45:17.620Z"),
"logoutTime" : ISODate("2017-09-23T06:37:17.620Z"),
}
{
"_id" : BinData(3,"B0R7SkeZ30rCjsp/Kftphw=="),
"createdTime" : ISODate("2017-09-24T06:50:17.620Z"),
"userName" : "testUser2",
"loggedOnDuration" : NumberLong(10),
"loginTime" : ISODate("2017-09-24T06:50:17.620Z"),
"logoutTime" : ISODate("2017-09-24T06:59:17.620Z"),
}

我只想为每个用户获取一个具有最大创建时间的文档。输出应该是这样的-

{
"_id" : BinData(3,"B0R7SkeZ30rCjsp/Kftphw=="),
"createdTime" : ISODate("2017-09-22T06:42:17.620Z"),
"userName" : "testUser1",
"loggedOnDuration" : NumberLong(10),
"loginTime" : ISODate("2017-09-22T06:42:17.620Z"),
"logoutTime" : ISODate("2017-09-23T06:37:17.620Z"),
}
{
"_id" : BinData(3,"B0R7SkeZ30rCjsp/Kftphw=="),
"createdTime" : ISODate("2017-09-24T06:50:17.620Z"),
"userName" : "testUser2",
"loggedOnDuration" : NumberLong(10),
"loginTime" : ISODate("2017-09-24T06:50:17.620Z"),
"logoutTime" : ISODate("2017-09-24T06:59:17.620Z"),
}

我正在使用 MongoCollection 类进行 MongoDB 操作。如何使用 MongoCollection 库获得此输出?

最佳答案

您可以使用聚合框架,https://docs.mongodb.com/manual/aggregation/ ,按用户名对 session 文档进行分组并获取最大登录时间。使用 mongo shell,聚合管道将如下所示:

db.session.aggregate([
{$group: {_id:"$userName", loginTime: {$max: "$loginTime"}}}
])

根据用户名分组的单个阶段。

这可以使用BasicDBObjects在java中重新创建:

final MongoCollection<Document> mongoCollection = database.getCollection("sessions");

List<Bson> pipeline = new ArrayList<>();
BasicDBObject groupStage = new BasicDBObject("$group",
new BasicDBObject("_id", "$userName")
.append("loginTime", new BasicDBObject("$max", "$loginTime")));
pipeline.add(groupStage);

AggregateIterable<Document> result = mongoCollection.aggregate(pipeline);

关于java - 如何使用Java驱动程序在MongoDB中按用户名获取每个用户组的最后一个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46544935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com