1

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

第一种方法

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 的新属性。

我可以在第一个查询中看到我对“Expenses”集合更加明确,而在第二个查询中我只是指定了 Expense 类型。现在是否可以以通用方式进行相同的更新?

4

1 回答 1

0

这与您提出的最后一个问题有点相似,我认为对于 LINQ 能做什么和不能做什么存在一些误解。

第二行包含表达式Update<Expense>.Set(e => e.Description, "some text")。重要的是要认识到该语句 100% 与上下文无关:它完全不知道在“嵌入对象”上使用的事实,或者在这种情况下,它用于$存在位置运算符的数组查询中.

您希望它Update<T>.Set(e => e.Prop)知道它是在对 type 的某个查询的上下文中调用的,并且它知道 type inT2的唯一属性被调用,并且它知道这是一个数组,并且它必须使用数组表达式进行匹配。如您所见,即使只是插入一个TT2Expenses$在输出中插入一个并替换一个名称。

假设Expense您的父对象中有两个数组,ExpensesA并且ExpensesB. 驱动程序如何从第二个查询中知道它应该指的是ExpensesA,而不是ExpensesB

作为一般规则,如果您的集合是 type T,您只想在其中使用Query<T>Update<T>例如db.Update<Event>(Query<Event>.EQ(p=>p.Id, 12), Update<Event>.Set(p => p.Details.Date, newDate))。如果您想使用 MongoDB 特有的功能,在许多情况下您将不得不使用基于字符串的方法。

于 2013-09-10T09:27:20.767 回答