在c#mongodb中减少uint字段

时间:2018-03-10 02:00:08

标签: c# mongodb

我正在尝试将uint字段从1递减到0.由于Inc的工作方式,我必须将它转换为int,因此:

UpdateDefinition<Student> updateDef = Builders<Student>.Update.Inc(s => (int)s.Grade, -1);
GetStudentCollection().UpdateOne(s => s.Id == 12345, updateDef);

当我使用1而不是-1进行增量时,这非常正常,但是当我运行此代码时,我收到以下错误:

System.OverflowException: Value was either too large or too small for a UInt32.
   at System.Convert.ToUInt32(Int32 value)

我已经从该LINQ查询中调试了检索到的Student,并在我尝试减少之前确认s.Grade位于1。由于0在有效uint范围内,我不明白为什么它会出错。

我可以错过什么?如何绕过uint? (如在“不使用uints”之外的解决方案中)

1 个答案:

答案 0 :(得分:0)

Inc中的

UpdateDefinitionBuilder定义为:

public UpdateDefinition<TDocument> Inc<TField>(FieldDefinition<TDocument, TField> field, TField value);

相同类型TField用于字段定义(FieldDefinition<TDocument, TField>),对于增量值,这就是后续表达式无法编译的原因:

Builders<Student>.Update.Inc(x => x.Grade, -1);

通过将x.Grade转换为int,您可以欺骗编译器而不是MongoDB驱动程序。最终,驱动程序会尝试将-1的值转换为投放uint的{​​{1}}的模型类型。

如果你想为OverflowException属性保留uint的数据类型并且有可能减少它,我唯一可以理解的方法是绕过强类型Grade并且使用原始UpdateDefinition运算符:

$inc