【发布时间】:2017-06-22 06:48:58
【问题描述】:
我试图按上次交互对文档进行排序。 meta_data.access_times 是一个数组,每次用户交互时都会更新,新的日期对象附加到数组的最后一个元素。有没有办法按数组的最后一个元素排序?
尝试 1:
private Aggregation makeQuery(String userId) {
return newAggregation(
match(Criteria.where("user_id").is(userId)),
sort(Sort.Direction.DESC, "$meta_data.access_times"),
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("access_times", "$meta_data.access_times"))
);
}
尝试2:
private Aggregation makeQuery(String userId) {
return newAggregation(
match(Criteria.where("user_id").is(user_id)),
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")).max("$meta_data.access_times").as("access_time"),
sort(Sort.Direction.DESC, "access_time")
);
}
文档中的示例 meta_data 数组
"meta_data" : { "access_times" : [
ISODate("2017-06-20T14:04:14.910Z"),
ISODate("2017-06-22T06:27:32.210Z"),
ISODate("2017-06-22T06:27:35.326Z"),
ISODate("2017-06-22T06:31:28.048Z"),
ISODate("2017-06-22T06:36:19.664Z"),
ISODate("2017-06-22T06:37:00.164Z")
] }
【问题讨论】:
-
好吧,我们似乎遗漏了您的文档实际外观的任何表示。愿意与我们分享吗?
-
@NeilLunn 更新
-
所以“最后一个”总是附加的,因此是“最新的”?通常只是检查。
-
@NeilLunn 是的!
-
你期望输出什么?
group把我扔了,因为不清楚会发生什么。主要是因为它无效。如何显示整个文档(仅 2 或 3 个)以及您期望获得的查询结果。这将比您的查询尝试更清楚地解释。日期部分我已经明白了。
标签: arrays mongodb sorting spring-boot