【发布时间】:2018-04-25 02:10:00
【问题描述】:
我正在尝试使用聚合按日期对文档进行排序。但我做不到。我的尝试如下。我错过了什么吗?
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"
} }
【问题讨论】:
-
您期待什么?这只是要求对字段列表进行“分组”,仅此而已。这些都在
_idBTW 下“分组”。所以它是"_id.last_access_time"。但不知何故,我认为这实际上不是你打算做的查询。 -
我要做的是对具有上述字段和排序结果“last_access_time”的文档进行分组。
-
您所说的“组”是什么意思?如果您真的打算发生什么,那么按照我给您的正确命名进行排序实际上会起作用。否则,您的实际含义与您认为“组”的实际含义不同。
标签: java mongodb spring-boot aggregation