2011-03-02 36 views
0

我覺得這樣做一定很簡單,但無法完成 - 任何幫助將不勝感激。我對LINQ和MongoDB比較陌生。使用LINQ選擇嵌入對象(來自MongoDB)

我有以下兩個實體:

class ParentObject 
{ 
    GUID ParentId {get;set;} 
    IList<ChildObject> ChildObjects {get;set;} 
    ...other properties 

    ParentObject() 
    { 
     childObjects = new List<ChildObject>(); 
    } 
} 

class ChildObject 
{ 
    GUID ChildId {get;set;} 
    ...other properties 
} 

那我堅持到MongoDB實例(如一個文件,與子文檔嵌入)。我需要做的是使用ParentId和ChildId檢索存儲在ParentObject文檔中的一個ChildObject子文檔。我幾乎沒有我想要什麼下面的方法/方法調用,但我只能基於索引(0,1等)返回一個IList或一個特定ChildObject:

// I know this won't work  

var parentId = (Some GUID); 
var childId = (Some GUID); 

var result = 
    SingleWithSelect<ParentObject, ChildObject> 
    (
     x => x.Id == parentId && x.ChildObjects.ChildId == ChildId, 
     y => y.ChildObject 
    ); 


public TResult SingleWithSelect<T, TResult>(
    System.Linq.Expressions.Expression<Func<T, bool>> whereExpression, 
    System.Linq.Expressions.Expression<Func<T, TResult>> selectExpression) 
    where T : class, new() 
     { 
      TResult retval = default(TResult); 
      using (var db = Mongo.Create(ConnectionString())) 
      { 
       retval = db.GetCollection<T>().AsQueryable() 
          .Where(whereExpression) 
          .Select(selectExpression) 
          .SingleOrDefault(); 
      } 
      return retval; 

     } 

很多感謝提前任何幫助/指針。

-Mike

+1

只需兩步:** 1。**通過parentId加載父級。 ** 2。**從父級獲取子級ID:* parent.ChildCollection.Single(x => x.Id == childId); * – 2011-03-02 23:46:13

+0

這樣做,在服務器端執行它會更好,但因爲它不被支持,這會 - 謝謝。 – Mikalee 2011-03-03 15:50:12

回答

1

這在Mongodb本身當前不支持。在匹配時,整個文檔將被返回,而不僅僅是匹配的子文檔。我不確定標準是否爲此提供支持,並在驅動程序方面提供過濾。 MongoDB上此功能請求的開放JIRA項目是http://jira.mongodb.org/browse/SERVER-828

0

使用map/reduce來檢索嵌入文檔。