我正在尝试更新深度嵌套数组中的单个字段。
public class Maker
{
public int Id { get; set; }
public List<Vehicle> Vehicles { get; set; }
}
public class Vehicle
{
public int Id { get; set; }
public int Price { get; set; }
public List<Part> Parts { get; set; }
}
public class Part
{
public int Id { get; set; }
public string Name { get; set; }
}
更新一级数组中的字段非常顺利。更新二级数组中的字段失败了。
public void UpdateNestedArrayFields()
{
var client = new MongoClient();
var db = client.GetDatabase("test");
var makers = db.GetCollection<Maker>("makers");
// Create a maker and add a vehicle
var newPart = new Part() { Id = 34, Name = "Wheel" };
var newVehicle = new Vehicle() { Id = 17, Price = 1000, Parts = new List<Part>() { newPart } };
var newMaker = new Maker() { Id = 5, Vehicles = new List<Vehicle>() { newVehicle } };
// Update vehicle's price (WORKS)
makers.FindOneAndUpdate(
m => m.Id == newMaker.Id && m.Vehicles.Any(v => v.Id == newVehicle.Id),
Builders<Maker>.Update.Set(m => m.Vehicles[-1].Price, 2000));
// Update part's name (**FAILS**)
makers.FindOneAndUpdate(
m => m.Id == newMaker.Id && m.Vehicles.Single(v => v.Id == newVehicle.Id).Parts.Any(p=> p.Id == newPart.Id),
Builders<Maker>.Update.Set(m => m.Vehicles[-1].Parts[-1].Name, "Tire"));
}
我知道不支持多个定位操作符,因此我的最后一行代码(m.Vehicles[-1].Parts[-1].Name)有些烂。
显然,我不是唯一遇到这个问题的人,我找到了不同的解决方案,如this或that,但是它们都不是类型安全的。生成的代码非常丑陋且容易出错。
所以我想知道:是否有任何方法重新设计我的代码使其类型安全?
我正在使用MongoDb 4.0.9和C#驱动程序2.11.5。
编辑(2020年1月11日): 对于任何感兴趣的人,我发现了这个非常好的扩展程序,由Massimiliano Kraus开发,虽然有点过时(2017年),但仍然有效,并且证明是一个巨大的帮助。谢谢你,Massimiliano!MongoDB.DeepUpdater.CSharp