我试图按上次交互对文档进行排序。 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")
] }
我通过使用$unwind操作来解决问题。
private Aggregation makeQuery(String userId) {
return newAggregation(
match(Criteria.where("user_id").is(userId)),
unwind("$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")).max("$meta_data.access_times").as("access_time"),
sort(Sort.Direction.DESC, "access_time")
);
}
当你不知道要推送的元素是否有序时(例如,一个用户正在推送他 Score...(,你可以使用 $push 和 $sort 来拥有一个有序数组,那么你可以通过"find({userId:yourUseId}.sort("metadata.access_time.0":-1(进行排序。
此解决方案假设您的阵列在创建/更新时与$sort一起排序:LINK
当您确定推送不需要排序时(例如,您正在为该用户推送Access_Date(,您可以使用$operator (tnx Erdenezul( $push和取消$sort。链接
理论上,如果 find(( 只获取少量文档,则不需要数组"access_time"上的索引。否则,您可以添加带有 {"metadata.access_time.0": -1} 的索引。
祝你好运!