我将MongoDB v4.0与C#驱动程序v2.8.1结合使用,并且正在从传统API升级到新API。
我有一个集合,其中的数据结构在嵌套字段内包括一个枚举。
当我查询此集合并且某些文档为空时,出现异常:
FormatException: Cannot deserialize a 'Orientations' from BsonType 'Null'.
我尝试在查询中添加空检查,但是导致错误:
"Command aggregate failed: The $cond accumulator is a unary operator."
我正在使用Group Aggregate来获取按Name分组的所有数据,然后从每个组中获取First。
C#:
collection.Aggregate().Group(r => r.Data.Name, r => new Info()
{
Name = r.First().RecipeData.Name,
Status = r.First().RecipeData.Status,
Orientation = r.First().Data.Info != null ? r.First().Data.Info.Orientation : Orientations.Down,
}
Command:
{{ "aggregate" : "Element", "pipeline" : [{ "$match" : { } }, {
"$group" : { "_id" : "$Data.Name", "Name" : { "$first" : "$Data.Name" },
"Status" : { "$first" : "$Data.Status" },
"Orientation" : { "$cond" : [{ "$ne" : [{ "$first" : "$Data.Info" }, null] }, { "$first" : "$Data.Info.Orientation" }, 270] } } }],
"cursor" : { }
}}
我也尝试注册一个自定义序列化程序,但是由于某种原因,它可用于其他枚举,并忽略此数据结构中的枚举,尽管此结构没有什么不同。
编辑:现在,将我的自定义序列化程序移动到我的类构造函数后,它可以工作。我以为它早到了,但是由于某种原因,它没有为此特定类型注册。
我仍然想知道如何使查询与null检查一起使用,以防将来我需要将其用于其他用途。