【问题标题】:C# How to get specific item from nested arrayC#如何从嵌套数组中获取特定项
【发布时间】:2017-12-07 11:34:58
【问题描述】:

我有以下型号:

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&lt;Driver&gt;,因此所有项目。但我只想检索一个处于活动状态的Driver

【问题讨论】:

  • 展开驱动程序,只选择活动的驱动程序。或者在代码中做同样的事情。

标签: c# mongodb mongodb-query


【解决方案1】:

上述接受的答案对我不起作用。它什么也没返回。您可以使用以下代码:

var activeDriver = await _carCollection.AsQueryable().Where(a =&gt; a.Id == carId).SelectMany(a =&gt; a.Drivers).Where(e =&gt; e.IsActive).FirstOrDefault();

你可以查看这个link

【讨论】:

    【解决方案2】:

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

    与查询的内容完全匹配。

    【讨论】:

    • 感谢您的回答。刚试了一下,但我得到错误:“命令查找失败:位置投影'Drivers.$'与查询文档不匹配..”
    • @user348173 你在尝试哪种形式?确保您实际上包含查询的一部分以测试IsActivetrue。因此,如果没有尝试匹配 Drivers 的元素,那么您会收到该错误。
    • 我使用第一种形式。是的,我忘了放任何。无论如何,现在我得到空结果。但是,在数据库中,我看到一个项目是真的
    • @user348173 它们的数量无关紧要,因为位置 $ 运算符仅返回“第一个”。在我检查 LINQ 语法时,请以第二种方式为我查询。哪个更难检查,因为我基本上需要重新创建你的类结构。
    • @user348173 包含 MongoDB 的记录查询。在我看来是正确的。可能您的集合数据与类定义不匹配
    猜你喜欢
    • 2020-01-15
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多