gpt4 book ai didi

java - 按日期排序 聚合 mongodb

转载 作者:行者123 更新时间:2023-12-02 12:01:04 25 4
gpt4 key购买 nike

我正在尝试使用聚合按日期对文档进行排序。但我无法做到。我的尝试如下。我错过了什么吗?

public static JSONArray get_users_from_db(String botId, String pageId, MongoTemplate mongoTemplate) throws Exception {
AggregationResults<AgentUserLogs> groupResults = mongoTemplate.aggregate(makeQuery(botId, pageId), "chatuser_log", AgentUserLogs.class);
List<AgentUserLogs> list = groupResults.getMappedResults();
JSONArray array = new JSONArray();
Gson gson = new Gson();
for (AgentUserLogs obj : list) {
array.put(new JSONObject(gson.toJson(obj)));
}
return array;
}

private static Aggregation makeQuery(String botId, String pageId) {
return newAggregation(
match(Criteria.where("bot_id").is(botId).and("page_id").is(pageId)),
group(Fields.fields().and("first_name", "$meta_data.user_data.first_name").and("last_name", "$meta_data.user_data.last_name").and("profile_pic", "$meta_data.user_data.profile_pic").and("user_id", "$user_id").and("last_message", "$live_agent.last_message").and("last_access_time", "$meta_data.last_access_time")),
sort(Sort.Direction.DESC, "last_access_time")
);
}

public class AgentUserLogs {

private String first_name;
private String last_name;
private String profile_pic;
private String user_id;
private Instant last_access_time;
private Object last_message;

@Override
public String toString() {
return "{" +
"first_name='" + first_name + '\'' +
"last_name='" + last_name + '\'' +
"profile_pic='" + profile_pic + '\'' +
"user_id='" + user_id + '\'' +
"last_access_time='" + last_access_time + '\'' +
"last_message='" + last_message + '\'' +
"}";
}
}

示例文档

{
"_id" : ObjectId("5a0698755a640c6324a17581"),
"bot_id" : "1",
"page_id" : "2039339889632748",
"user_id" : "1258922750901107"
"meta_data" :
"user_data" : {
"first_name" : "Januka",
"last_name" : "Samaranayake",
"profile_pic" : "https://scontent.xx.fbcdn.net/v/t1.0-1/23172506_1725189057492533_3460235097206138375_n.jpg?oh=5183e7dd4e8ac49a49491055c24696d6&oe=5AA59955",
},
},
"live_agent" : {
"last_message" : {
"time" : "Sun Nov 12 12:24:53 IST 2017",
"message" : "hh",
"status" : "notRead"
},
"thread" : [
{
"from" : "user",
"time" : "Sat Nov 11 15:23:10 IST 2017",
"message" : {
"message" : "Default",
"type" : "init"
}
},
{
"from" : "user",
"time" : "Sun Nov 12 11:08:55 IST 2017",
"message" : {
"message" : "hi",
"type" : "text"
}
},
{
"from" : "agent",
"time" : "Sun Nov 12 11:38:14 IST 2017",
"message" : {
"message" : "hello",
"type" : "text"
}
},
{
"from" : "agent",
"time" : "Sun Nov 12 11:42:31 IST 2017",
"message" : {
"message" : "hi",
"type" : "text"
}
},
{
"from" : "agent",
"time" : "Sun Nov 12 12:23:31 IST 2017",
"message" : {
"message" : "hi",
"type" : "text"
}
},
{
"from" : "user",
"time" : "Sun Nov 12 12:24:53 IST 2017",
"message" : {
"message" : "hh",
"type" : "text"
}
}
],
"connect" : false,
"status" : "New"
} }

最佳答案

我认为您的 $group 以及 $sort 中都有错误

从您粘贴的示例文档中,我无法判断您的last_access_time实际存储在哪里,但从您的模型(AgentUserLogs)来看,您似乎已将其与其余字段一起存储在user_data字段下找到。这是您最后一个错误的分组字段:

and("last_access_time", "$meta_data.last_access_time")

我相信你想写的是:

and("last_access_time", "$meta_data.user_data.last_access_time")

然后在您的 $sort 中,由于您按它分组,这意味着可以通过 _id.last_access_time 访问它。因此,您的最后一个排序管道必须如下所示:

sort(Sort.Direction.DESC, "_id.last_access_time")

根据您的代码,您的聚合管道应该如下所示(这只是一个示例):

db.getCollection('yourCollectionName').aggregate([{
$match: {
"bot_id": "1",
"page_id": "2039339889632748"
}
},
{
$group: {
_id: {
first_name: "$meta_data.user_data.first_name",
last_name: "$meta_data.user_data.last_name",
profile_pic: "$meta_data.user_data.profile_pic",
user_id: "$user_id",
last_message: "$live_agent.last_message",
last_access_time: "$meta_data.user_data.last_access_time"
}
}

},

{
$sort: {
"_id.last_access_time": -1
}
}
])

关于java - 按日期排序 聚合 mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47246626/

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