C# 在MongoDB中是否有强类型方式更新子文档?

C# 在MongoDB中是否有强类型方式更新子文档?,c#,mongodb,C#,Mongodb,我需要在Mongo中更新一个子文档,我就是这样做的。此屏幕截图显示了我的文档的外观。下面的代码显示了我是如何更新Geddy的名字和仪器的 注:该方法取自: var update=update.Set(“Members.$.Instrument”、“Keyboards”).Set(“Members.$.LastName”、“Leex”); var collection=MongoDbHelper.Db.GetCollection(“Bands”); collection.Update(Query

我需要在Mongo中更新一个子文档,我就是这样做的。此屏幕截图显示了我的文档的外观。下面的代码显示了我是如何更新Geddy的名字和仪器的

注:该方法取自:

var update=update.Set(“Members.$.Instrument”、“Keyboards”).Set(“Members.$.LastName”、“Leex”);
var collection=MongoDbHelper.Db.GetCollection(“Bands”);
collection.Update(Query.And(Query.EQ(“Name”、“Rush”)、Query.EQ(“Members.FirstName”、“Geddy”)、Update);

是否有另一种/更好的方法可以使用强类型属性而不是所有这些字符串文本?

目前不支持使用类型化构建器编写类似这样的查询或更新(即对数组的各个子字段进行查询并在更新中使用“$”)

困难在于要找到编译时没有错误但能正确表达所需意图的表达式

例如,以下可能是一个可行的设计,但使用-1作为索引值有点不切实际:

var query = Query.And(
    Query<Band>.EQ(b => b.Name == "Rush"),
    Query<Band>.EQ(b => b.Members[-1].FirstName == "Geddy"));
var update = Update<Band>
    .Set(b => b.Members[-1].Instrument, "Keyboards")
    .Set(b => b.Members[-1].LastName, "Leex");
var query=query.And(
Query.EQ(b=>b.Name==“Rush”),
Query.EQ(b=>b.Members[-1].FirstName==“Geddy”);
var update=更新
.Set(b=>b.Members[-1]。仪器,“键盘”)
.Set(b=>b.Members[-1].LastName,“Leex”);
注意:这只是在类型化构建器中支持“$”的一种可能的设计。实际上并不是这样实现的


如果您对如何表达此功能的类型安全版本有任何想法,您应该创建一个JIRA票证,建议使用此功能。

什么是-1?这与$是一样的吗?我尝试了这一点,并得到了两个编译错误:
方法'EQ'的无重载采用1个参数
无法将带[]的索引应用于'System.Collections.Generic.IEnumerable'类型的表达式
-1只是表示涉及“$”的查询和更新的一种可能方法的示例。它实际上并没有实现。好吧,我举了你们的例子,尝试了很多不同的方法来实现它,但并没有实现。因此,底线是您建议的无法实现,但您所编写的将是一种很好的工作方式,如果这种方式存在的话。由于
ElementAt
是嵌入到C#驱动程序中的,所以在
列表上没有允许表达式的扩展方法就太糟糕了:
b=>b.Members.FirstPosition().FirstName
例如。考虑到
ElementAt
的工作原理,这实际上是一个非常简单的加法。(我宁愿有一个描述性的方法,而不是某种神奇的数字)。
var query = Query.And(
    Query<Band>.EQ(b => b.Name == "Rush"),
    Query<Band>.EQ(b => b.Members[-1].FirstName == "Geddy"));
var update = Update<Band>
    .Set(b => b.Members[-1].Instrument, "Keyboards")
    .Set(b => b.Members[-1].LastName, "Leex");