2015-06-15 35 views
0

我正在以下格式的集合:MongoDB的總結:不正確的排序結果

{_id:"blah" 
"rating" : { 
     "star" : "3.0", 
     "comment" : "", 
     "last_updated" : ISODate("2015-06-13T17:57:23.176Z") 
    } 
} 

我寫了一個查詢來計算平均收視率。隨着這個我的查詢也應該返回評級領域(最新的評級應該先出現)。

db.collection('reviews').aggregate(
[{ 
        $match: { 
         $and: [{ 
          "res_id": resID 
         }, { 
          "rating.star": { 
           $gt: 1 
          } 
         }] 
        } 
       }, { 
        $sort: { 
         "rating.last_updated": -1 
        } 
       }, { 
        "$group": { 
         "_id": null, 
         avg_rating: { 
          "$avg": "$rating.star" 
         }, 
         "reviews": { 
          "$addToSet": { 
           rating: "$rating", 
           uid: "$uid", 
           items: "$items" 
          } 
         }, 
         "uids": { 
          "$addToSet": "$uid" 
         } 
        } 
       }, { 
        "$project": { 
         "reviews": 1, 
         "avg_rating": 1, 
         "uids": 1 
        } 
       }] 
); 

返回的平均數是正確的,但是評論信息並非按時間遞減的順序排列。

"avg_rating" : 3.8888888888888888, 
"reviews" : [ 
{ 
    "rating" : { 
     "star" : 3.5000000000000000, 
     "comment" : "", 
     "last_updated" : ISODate("2015-06-13T20:44:05.475Z") 
    }, 
    "uid" : "977124278982354" 

}, 
{ 
    "rating" : { 
     "star" : 5, 
     "comment" : "", 
     "last_updated" : ISODate("2015-06-13T20:44:30.109Z") 
    }, 
    "uid" : "977124278982354" 
}, 

我認爲小組重新排序信息,所以我嘗試在$ group子句後添加排序條件,但徒勞無功。

{ 
    $group:.... 
},{ 
$sort: { 
    "rating.last_updated": -1 
} 
},{ 
"$project": { 
    "reviews": 1, 
    "av 

回答

0

這個問題似乎是,你試圖做一個排序的文件,其中僅$sort實際工作的根文件陣列上。

這可能是爲$unwind運營良好的情況下,你最終會得到很多根文檔各有格式:

{ 
    avg_rating: 3.8888888888888888, 
    reviews: { 
     "rating" : { 
      "star" : 3.5000000000000000, 
      "comment" : "", 
      "last_updated" : ISODate("2015-06-13T20:44:05.475Z") 
     }, 
     "uid" : "977124278982354" 
    } 
}, 
{ 
    avg_rating: 3.8888888888888888, 
    reviews: { 
     "rating" : { 
      "star" : 5, 
      "comment" : "", 
      "last_updated" : ISODate("2015-06-13T20:44:30.109Z") 
     }, 
     "uid" : "977124278982354" 
    } 
}, 
... 

那麼你應該能夠做一個$sortreviews.rating.last_updated