2017-07-04 42 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