C# Mongo更新和更新中的差异

C# Mongo更新和更新中的差异,c#,mongodb,C#,Mongodb,我正在使用一个查询来更新另一个文档中的嵌入数组。 我尝试了基于同一查询的不同方法,但得到了两个不同的结果 第一种方法 collection.Update(mongoQuery, MongoDB.Driver.Builders.Update.SetWrapped("Expenses.$.Description", "some text")); 此处,费用集合中嵌入文档的描述将按预期更新 在阅读了更多的C API之后,我找到了通用更新,并尝试了以下方法: collection.Update(mo

我正在使用一个查询来更新另一个文档中的嵌入数组。 我尝试了基于同一查询的不同方法,但得到了两个不同的结果

第一种方法

collection.Update(mongoQuery, MongoDB.Driver.Builders.Update.SetWrapped("Expenses.$.Description", "some text")); 
此处,费用集合中嵌入文档的描述将按预期更新

在阅读了更多的C API之后,我找到了通用更新,并尝试了以下方法:

collection.Update(mongoQuery, Update<Expense>.Set(e => e.Description, "some text"));
结果不一样。父文档将获得名为Description的新属性,而不是更新嵌入的文档


我可以在第一个查询中看到,我更明确地说明了费用收集,而在第二个查询中,我只是指定了费用类型。现在可以用通用的方式进行同样的更新了吗?

这有点类似于你问的最后一个问题,我认为对于LINQ能做什么和不能做什么存在一些误解

第二行包含表达式Update.Sete=>e.Description和一些文本。重要的是要认识到,该语句100%无上下文操作:它完全不知道在“嵌入对象”上使用了什么,或者在本例中,它是在存在位置运算符$的数组查询中使用的

您希望Update.Sete=>e.Prop知道它是在类型T2的某个查询的上下文中调用的,并且知道T2中类型T的唯一属性是Expenses,并且知道这是一个数组,并且必须使用数组表达式对其进行匹配。正如你所看到的,驱动程序将不得不考虑一大堆事情来做所有的魔术,即使只是插入一个$并在输出中替换一个名称。 假设父对象中有两个开支数组,ExpensesA和ExpensesB。从第二个查询中,驾驶员如何知道它指的是ExpensesA,而不是ExpensesB


作为一般规则,如果集合的类型为T,则只希望在其中使用查询和更新,例如db.UpdateQuery.EQp=>p.Id,12,Update.Setp=>p.Details.Date,newDate。如果您想使用MongoDB特有的功能,在许多情况下必须使用基于字符串的方法。

名称的差异不是问题所在吗?费用在第一位,费用在第二位。