按日期排序聚合mongodb

时间:2017-11-12 07:47:09

标签: java mongodb spring-boot aggregation

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

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"
    } }

1 个答案:

答案 0 :(得分:1)

我认为您的$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
        }
    }
])