2017-06-22 64 views
3

我試圖按上次交互對文檔進行排序。 meta_data.access_times是一個數組,每次用戶進行交互時都會更新,並且新的日期對象會附加到數組的最後一個元素。有什麼方法可以按數組的最後一個元素排序?按數組最後一個元素排序mongodb

嘗試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:在文檔

"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") 
     ] } 
+0

好吧,我們似乎錯過了文檔實際外觀的任何表示。謹慎與我們分享? –

+0

@NeilLunn更新 –

+0

所以「最後」總是附加,因此「最新」?通常只是檢查。 –

回答

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陣列I通過使用$放鬆操作解決了這個問題。

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") 
     ); 
    } 
2

當你不知道,如果推送元素有序與否,你可以使用$推$排序,以(例如,是推動他得分......用戶)有一個有序的數組,然後你可以按照「find({userId:yourUseId} .sort(」metadata.access_time.0「: - 1)排序。

這個解決方案假設你的數組是用$ sort創建的/更新時間:LINK

當您確定Push不需要排序(fo例如你正在爲該用戶推送一個Access_Date),你可以通過使用$運算符(tnx Erdenezul)推送和排除$ sort。 LINK

理論上,如果find()只提取幾個文檔,則不需要數組「access_time」上的索引。否則,你可以添加一個索引{「metadata.access_time.0」:-1}。

祝你好運!

+1

添加最新的訪問到第0個元素與推動位置0將不錯 – Erdenezul

+0

@Erdenezul你認爲不是一個可行的解決方案? –

+1

爲了避免排序,推送索引0處的最新元素更有效。 – Erdenezul

相關問題