0

複数のフィールドに基づいてレコードをソートしようとしています。しかし、レコードは最初のソート基準によってのみソートされます。ソートプロパティを別々に使用するとうまくいきます。春のmongoのタイムスタンプフィールドで日付のみを指定する

期待される結果は、まず、作成日によって降順に並べ替える必要があります。次に、ユーザーが並べ替えて降順で並べ替える必要があります。

以下は私のレコードリストです。予想される結果は、レコード3レコード2とレコード1の順である必要があります。まず、createdDateでソートされ、次にユーザーカウントでソートされます。以下

// record 1 
{ 
"_id": "a46asgasyas" 
"content": "sample data set 1", 
"userscount": 0, 
"createdDate": ISODate("2016-12-11T13:45:53.991Z") 
}, 
// record 2 
{ 
"_id": "a46asgasyas" 
"content": "sample data set 2", 
"userscount": 0, 
"createdDate": ISODate("2016-12-17T13:45:53.991Z") 
}, 
// record 3 
{ 
"_id": "a46asgasyas" 
"content": "sample data set 3", 
"userscount": 2, 
"createdDate": ISODate("2016-12-15T13:45:53.991Z") 
} 

私が試みたコード、

**Code snippet 1:** 
new Sort(new Sort.Order(Sort.Direction.DESC, "createdDate"), 
new Sort.Order(Sort.Direction.DESC, "userscount")); 

**Code snippet 2:** 
new Sort(new Sort.Order(Sort.Direction.DESC, "createdDate").and(, 
new Sort.Order(Sort.Direction.DESC, "userscount"))); 

両方のコードは最初の基準に基づいてのみソートされています。コードがどちらのソート基準でも機能しないのはなぜですか?

+0

typo( 'users'は' userscount'でなければなりません)とは別に、クエリは正常に動作します。クエリーは、まずdescDown順のcreatedDateフィールドでソートされ、次に、各createdDateソート内で、desccount順のuserscountフィールドによってソートされます。 – Veeram

+0

@Veeramええ、それは動作していません – Karthik

+0

それは正常に動作します。あなたには十分な文書がありません。追加ドキュメント '{ " userscount ":1、 " createdDate ":ISODate(" 2016-12-11T13:45:53.991Z ") }' { "userscount":1、 "createdDate":ISODate( "2016-12-11T13:45:53.991Z") } { "userscount":0、 "createdDate":ISODate( "2016-12-11T13:45:53.991Z" ) } '。 userscount descでどのようにソートされているかに注目してください。 – Veeram

答えて

0

ここでは、日付時刻を時刻の部分をゼロに設定して時刻に変換する必要があります。

変換を実行するには集約フレームワークが必要です。

$addFields部分は、すべての時間部分にオフセットを追加することによって時間部分を削除することです。

AggregationOperation project = new AggregationOperation() { 
    @Override 
    public DBObject toDBObject(AggregationOperationContext aggregationOperationContext) { 
    return 
     new BasicDBObject(
     "$addFields", new BasicDBObject(
     "createdDate", 
     new BasicDBObject(
      "$subtract", 
      new Object[]{ 
      "$createdDate", 
      new BasicDBObject(
       "$add", 
       new Object[]{ 
       new BasicDBObject("$multiply", 
         new Object[]{new BasicDBObject("$minute", "$createdDate"), 60000}), 
       new BasicDBObject("$multiply", 
         new Object[]{new BasicDBObject("$second", "$createdDate"), 1000}), 
       new BasicDBObject("$millisecond", "$createdDate") 
       } 
      ) 
      } 
     ) 
    ) 
    } 
}; 

AggregationOperation sort = Aggregation.sort(new Sort(new Sort.Order(Sort.Direction.DESC, "createdDate"), 
     new Sort.Order(Sort.Direction.DESC, "userscount"))); 

Aggregation agg = Aggregation.newAggregation(project, sort); 

List<DBObject> results = mongoOperations.aggregate(agg, Pojo.class, DBObject.class); 
関連する問題