如何更新 mongodb 中指定字段以外的所有文档字段

How to update all document fields except specified ones in mongodb

我给出一个简单的模型:

public class UserDocument
{
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    public string DisplayName { get; set; }

    public List<string> Friends { get; set; }
}

我正在使用最新的 C# 驱动程序,它能够使用 C# 对象替换文档,该对象将自动更新所有字段。问题是我想更新 除了用户朋友 之外的所有字段,因为它是一个包含与其他文档的对象关系的字段。当然我可以手动更新我想要更新的每个字段,这里只是两个。

但是这个例子很简单,只是为了说明我的观点。实际上,字段要多得多,更新每个字段会更难。这将需要一行让每个人使用 Set 运算符。此外,新添加的字段必须以与自动更新相反的相同方式得到支持。

有没有办法实现这一点 - 只需指定排除字段列表即可自动更新所有字段?

没有办法,使用提供的构建器进行 "blacklist" 更新,仅排除特定字段。

您可以查询旧文档,将这些字段的旧值复制到新实例中,然后在数据库中完全替换它。

您还可以通过使用反射遍历字段来生成这样的更新命令。

但是 MongoDB 驱动程序 不提供这样的查询 内置。

我想出了一个方法来使用 MongoDB 使用 Javascript/NodeJS,但也许逻辑可以转换为 C#?

我想更新所有字段而不必实际明确说明它们(事实证明,除一个字段外的所有字段)。

已尝试更新所有文档字段:

await examCollection.findOneAndUpdate(
  {_id: new ObjectID(this.examId)},
  {$set: this.data}
)

...除了,this.data 碰巧也有 _id,我不想更新。 (事实上​​,它给了我一个错误,因为 _id 是不可变的。)

因此,对于我的解决方法,我最终“删除”了我不想更新的对象上的所有字段(即 _id)。

成功更新所有non-specified文档字段:

// (1) specify fields that I don't want updated (aka get rid of them from object) (similar option in C#?)
delete this.data._id 
//delete this.data.anotherField
//delete this.data.anotherField2
//delete this.data.anotherField3
    
// (2) update MongoDB document
await examCollection.findOneAndUpdate(
  {_id: new ObjectID(this.examId)},
  {$set: this.data}
)

这比明确说明我 想要更新的所有字段要容易得多,因为有很多,而且它们将来可能会发生变化(添加了新字段,字段已删除等)。

希望这个攻略能帮到你!

注意:实际上,我之前在另一个文件中进行了“字段指定”,而不是像示例中那样在更新之前立即进行,但效果相同。