2016-02-13 45 views
1

如果成績是餐館內的排列,是否可以列出所有餐館及其最新成績?MongoDB C#列出子文檔中所有條目的最新版本

{ 
    "_id" : ObjectId("56bf7957b5e096fd06b755b2"), 
    "grades" : [ 
     { 
      "date" : ISODate("2014-11-15T00:00:00.000Z"), 
      "grade" : "Z", 
      "score" : 38 
     }, 
     { 
      "date" : ISODate("2014-05-02T00:00:00.000Z"), 
      "grade" : "A", 
      "score" : 10 
     }, 
     { 
      "date" : ISODate("2013-03-02T00:00:00.000Z"), 
      "grade" : "A", 
      "score" : 7 
     }, 
     { 
      "date" : ISODate("2012-02-10T00:00:00.000Z"), 
      "grade" : "A", 
      "score" : 13 
     } 
    ], 
    "name" : "Brunos On The Boulevard", 
} 

我會想:

{ 
    "_id" : ObjectId("56bf7957b5e096fd06b755b2"), 
    "grades" : [ 
     { 
      "date" : ISODate("2014-11-15T00:00:00.000Z"), 
      "grade" : "Z", 
      "score" : 38 
     } 
    ], 
    "name" : "Brunos On The Boulevard", 
} 

說明

answer below使用unwind operator。在this answer上有一個非常簡單的解釋,任何人都應該像我一樣對它感到困惑。

回答

1

一個選項可以做兩個操作的聚合,一個Unwind從輸入文檔中解構數組字段以輸出每個元素的文檔,然後按照date的降序排序操作。通過這種方式,您可以得到預期的結果,從聚合結果中選擇第一個元素:

var result = collection.Aggregate() 
         .Unwind(e => e["grades"]) 
         .SortByDescending(e=>e["grades.date"]) 
         .FirstOrDefault(); 
+0

這似乎有效。我說似乎是因爲我不明白爲什麼。 – BanksySan

+0

剛發現我需要添加一個'Match'元素,如果我想'ToList'它或者我用完了內存!我沒想到它是那個更大的查詢。 – BanksySan

+1

只讀[這個答案](http://stackoverflow.com/a/16448763/442351)這解釋得很好。 – BanksySan