2017-11-07 26 views
0

集計メソッドでmongoで複数ソートを使用すると、結果は正しい方法でソートされません。これは私のクエリです:mongoでの集計での複数ソート

db.MyCollection.aggregate(
{ 
    "$unwind": "$objects" 
}, 
{ 
    "$lookup": { 
     "from": "CollectionA", 
     "localField": "objects.itemId", 
     "foreignField": "_id", 
     "as": "itemOne" 
    } 
}, 
{ 
    "$lookup": { 
     "from": "CollectionB", 
     "localField": "user_id", 
     "foreignField": "id", 
     "as": "users" 
    } 
}, 
{ 
    "$lookup": { 
     "from": "CollectionC", 
     "localField": "objects.itemName", 
     "foreignField": "name", 
     "as": "itemTwo" 
    } 
}, 
{ 
    "$addFields": { 
     "item": { 
      "$arrayElemAt": [ 
       "$itemOne", 
       0 
      ] 
     }, 
     "user": { 
      "$arrayElemAt": [ 
       "$users", 
       0 
      ] 
     }, 
     "itemP": { 
      "$arrayElemAt": [ 
       "$itemTwo", 
       0 
      ] 
     } 
    } 
}, 
{ 
    "$addFields": { 
     "itemName": { 
      "$ifNull": [ 
       "$item.name", 
       "$objects.itemName" 
      ] 
     }, 
     "userName": { 
      "$concat": [ 
       "$user.firstname", 
       " ", 
       "$user.lastname" 
      ] 
     } 
    } 
}, 
{ 
    "$match": { 
     "client_id": 2 
    } 
}, 
{ 
    "$skip": 1 
}, 
{ 
    "$limit": 10 
}, 
{ 
    "$project": { 
     "date": "$objects.date", 
     "state": "$objects.state" 
    } 
}, 
{ 
    "$sort": { 
     "objects.state": 1, 
     "objects.date": 1, 
    } 
} 

) 

正確には、「日付」フィールドは日付タイプであり、「状態」フィールドは数字タイプです。 1つだけの並べ替えを使用する場合:結果の順序は正しいです。しかし、2つのソートを使用すると、結果は正しく順序付けられません。アイデアはありますか?なぜですか?

+0

"結果は正しく注文されていません"とはどういう意味ですか?クエリの現在の結果と期待される出力を追加してください。 – felix

+1

'$ project'のフィールドの名前を変更したため、正しくソートされません。だから '{$ sort:{state:1、date:1}}'でなければなりません。本当にあなたが** **それらのフィールドだけが返されていることに気付いているのではないでしょうか。すべての '$ addFields'ステージの後で' '$ project''を"新しいフィールドを追加 "してから破棄することは率直には意味がありません。だからここにいくつかのコンセプトが欠けているようだ。 –

+0

@NeilLunn完璧!私は$ projectと名前を変更するフィールドを忘れました...ありがとう! – Kael

答えて

0

@Neil Lunnさんのように: $ projectのフィールドの名前を変更したため、正しくソートされません。それで、{$ sort:{state:1、date:1}}

関連する問題