C# 如何从嵌套数组中获取特定项

标签 c# mongodb mongodb-query

我有以下模型:

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这是活跃的。

最佳答案

您基本上需要包括 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"
 }

与查询的内容完全匹配。

关于C# 如何从嵌套数组中获取特定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44898449/

相关文章:

c# - 从Web浏览器控件内的silverlight调用WPF中的函数

PHP MongoDB - 不推荐使用不带游标选项的聚合命令。什么?

javascript - 循环不根据查询输出 true 或 false

mongodb - 在填充中排序不起作用( Mongoose )

mongodb - Mongoose 填充通过找到对象引用键

mongodb - 如何返回数组字段大小大于给定数字的所有文档?

mongodb - 如何在mongodb中将时间戳转换为日期?

c# - SQL 连接错误 - C#

c# - 在 lock() 中执行 foreach 时修改列表

c# - 将 Windows MP3 解码器与 Un4Seen Bass.NET 结合使用