我正在使用一个查询来更新另一个文档中的嵌入式数组。 我尝试了基于相同查询的不同方法,但得到两个不同的结果
第一种方法
collection.Update(mongoQuery, MongoDB.Driver.Builders.Update.SetWrapped("Expenses.$.Description", "some text"));
此处,Expenses集合中嵌入文档的描述按预期更新。
阅读更多C#API我找到了通用的更新并尝试了这个:
collection.Update(mongoQuery, Update<Expense>.Set(e => e.Description, "some text"));
结果不一样。父文档不是更新嵌入文档,而是获取名为Description的新属性。
我可以在第一个查询中看到我对“费用”集合更加明确,而在第二个查询中我只是指定了费用类型。现在是否可以通用方式进行相同的更新?
答案 0 :(得分:0)
这与你提出的最后一个问题有点类似,我认为对于LINQ可以做什么和不能做什么有一些误解。
第二行包含表达式Update<Expense>.Set(e => e.Description, "some text")
。重要的是要意识到这个语句100%无上下文运行:它绝对不知道在'嵌入对象'上使用的事实,或者在这种情况下,它是在数组查询中使用的位置运算符{ {1}}存在。
您希望$
知道在类型Update<T>.Set(e => e.Prop)
上的某些查询的上下文中调用它,并且它知道T2
中T
类型的唯一属性被称为T2
并且它知道这是一个数组,并且它必须使用数组表达式进行匹配。正如您所看到的,即使只是插入Expenses
并替换输出中的名称,驱动程序也必须考虑相当多的事情来做所有的魔术。
假设您的父对象$
和Expense
中有两个ExpensesA
数组。从第二个查询中,驱动程序如何知道它应引用ExpensesB
,而不是ExpensesA
。
作为一般规则,如果您的收藏品属于ExpensesB
类型,则您只想在其中使用T
和Query<T>
,例如Update<T>
。如果你想使用MongoDB特有的功能,你必须在很多情况下使用基于字符串的方法。