2017-07-04 22 views
1

得到具體的項目,我有以下型號:C#如何從嵌套的數組

public class Car 
{ 
    public string Id {get; set;} 
    public IList<Driver> Drivers {get; set;} 
} 

public Driver 
{ 
    public string Id {get; set;} 
    public bool IsActive {get; set;} 
} 

如何選擇驅動程序被激活?

var carId = "..."; 
var activeDriver = await _carCollection.Find(a => a.Id == carId 
      && a.Drivers.Any(e=>e.IsActive)) 
      .Project(a=>a.Drivers) 
      .SingleOrDefaultAsync(); 

此代碼返回IList<Driver>,所以所有項目。但我想只檢索一個有效的Driver

+0

展開驅動程序,只選擇活動的驅動程序。或者在代碼中做同樣的事情。 – CodeCaster

回答

3

您基本上需要包含positional $ operator才能從給定的查詢條件中返回匹配的數組元素。你可以用ElementAt(-1)

var activeDriver = await _carCollection.Find(a => a.Id == carId 
     && a.Drivers.Any(e => e.IsActive)) 
     .Project(a => a.Drivers.ElementAt(-1)) 
     .SingleOrDefaultAsync(); 

做到這一點,也可以寫爲:

var builder = Builders<BsonDocument>.Filter; 

var activeDriver = await _carCollection.Find(
     builder.Eq("Id", carId) & builder.Eq("Drivers.IsActive", true)) 
     .Project(Builders<BsonDocument>.Projection.Include("Drivers.$")) 
     .SingleOrDefaultAsync(); 

如果我跑任一者,然後我得到的東西得到真實發送到MongoDB中的串行輸出:

{ 
    "find" : "cars", 
    "filter" : { "_id" : "a", "Drivers" : { "$elemMatch" : { "IsActive" : true } } }, 
    "projection" : { "Drivers.$" : 1, "_id" : 0 }, 
    "limit" : 2, 
    "$db" : "test" 
} 

它與查詢應該完全匹配。

+0

感謝您的回答。只是tred它,但我得到錯誤: 「命令查找失敗:位置投影'驅動程序。$'與查詢文檔不匹配。」 – user348173

+0

@ user348173您試圖使用哪種形式?確保你實際上包含了部分查詢來測試'IsActive'是否爲'true'。所以如果沒有什麼東西想要匹配'Drivers'的元素,那麼你會得到那個錯誤。 –

+0

我使用第一種形式。是的,我忘了放任何。無論如何,現在我得到空結果。但是,在數據庫中,我看到一個項目是真實的 – user348173