按数组的最后一个元素 mongodb 排序



我试图按上次交互对文档进行排序。 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} 的索引。

祝你好运!

最新更新