Mongo 更新 和更新的区别

本文关键字:更新 区别 Mongo | 更新日期: 2023-09-27 18:30:40

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

第一种方法

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

结果不一样。父文档不会更新嵌入的文档,而是获取一个名为"说明"的新属性。

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

Mongo 更新<T> 和更新的区别

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

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

你希望Update<T>.Set(e => e.Prop)知道它是在类型 T2 的某个查询上下文中调用的,并且它知道 T2T 类型的唯一属性被称为 Expenses,并且它知道这是一个数组,并且必须使用数组表达式匹配它。如您所见,驱动程序必须考虑很多事情才能完成所有魔术,即使它只是插入$并在输出中替换名称。

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

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