2012-07-09 64 views
2

我試圖做一個多領域的「獨特」的查詢,這當然是不可能的
(見我試圖在這裏:Selecting a new type from linq query使用蒙戈DB。集團與C#司機

繼我實現這個,我發現我能夠通過使用.group和MongoDB來檢索我需要的數據。

在MongoDB C#包裝中有沒有使用下面的查詢/命令的方法?

disciplines = db.result.group({ 
    key: {DisciplineName:1, DisciplineCode:1}, 
    reduce: function(obj, prev) { if (!obj.hasOwnProperty("DisciplineName")) { 
     prev.DisciplineName = obj.DisciplineName; 
     prev.DisciplineCode = obj.DisciplineCode; 
    }}, 
    initial: { } 
}); 

Result類(文件)看起來像:

var initial = new BsonDocument(); 

//return a list of keys for the group 
var keyFunction = (BsonJavaScript)@"function(doc) { 
             return { 
              DisciplineName : doc.DisciplineName, 
              DisciplineCode: doc.DisciplineCode 
             }; 
            }"; 

var reduce = @"function(obj, prev) { 
        if (!obj.hasOwnProperty(""DisciplineName"")) { 
         prev.DisciplineName = obj.DisciplineName; 
         prev.DisciplineCode = obj.DisciplineCode; 
        } 
       }"; 

var bsonDocs = _db.GetCollection("result").Group(Query.Exists("DisciplineName"), keyFunction, initial, reduce, null).ToArray(); 

//I hate this!! 
var disciplines = new List<Discipline>(); 

foreach (var item in bsonDocs) 
    disciplines.Add(BsonSerializer.Deserialize<Discipline>(item)); 

我真的unfond的方式,我必須遍歷IEnumerable<BsonDocument>連載:

public class Result 
{ 
    public virtual int ResultId { get; set; } 
    public virtual string DisciplineCode { get; set; } 
    public virtual string DisciplineName { get; set; } 
    public virtual int CompetitorId { get; set; } 
    //other stuff 
} 

回答

3

使用解決每個成一個Discipline對象。

將更新,如果有可能反序列化BsonDocuments

+0

的集合記住的Map/Reduce是不是建立實時查詢。它非常緩慢,並且在使用中有其他一些影響。更好的方法是有一個單獨的集合,其中包含預先計算的這些結果。 – 2012-07-09 12:23:01

+0

我意識到..但在我的領域這個單獨的集合將是一個相當痛苦。我打算將上面的map/reduce的結果無限期地緩存幾個小時(直到Result集合每晚更新) – Alex 2012-07-09 13:02:52