是否有一种强类型的方式来更新MongoDB中的子文档?

时间:2014-01-22 15:46:39

标签: c# mongodb

我需要更新Mongo中的子文档,这就是我的做法。此屏幕截图显示了我的文档的外观。下面的代码显示了我如何更新Geddy的名称和工具。

enter image description here

注意:此方法取自this SO post

var update = Update.Set("Members.$.Instrument", "Keyboards").Set("Members.$.LastName", "Leex");

var collection = MongoDbHelper.Db.GetCollection<Band>("Bands");
collection.Update(Query.And(Query.EQ("Name", "Rush"), Query.EQ("Members.FirstName", "Geddy")), update);

有没有其他/更好的方法可以使用强类型属性而不是所有这些字符串文字?

1 个答案:

答案 0 :(得分:2)

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

困难在于表达式无错误地编译并且正确表达所需的意图。

例如,以下可能是一个可行的设计,但使用-1作为索引值是一种hacky:

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");

注意:这只是在类型化构建器中支持“$”的可能设计。它实际上并没有这样实现。

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