我有一个像这样的mongo模型:
class ObjectA {
[BsonId(IdGenerator = typeof(BsonObjectIdGenerator))]
public BsonObjectId Id;
[BsonElement("number")]
public int Number { get; set; }
[BsonElement("b")]
public List<ObjectB> objectB { get; set; }
}
class ObjectB {
[BsonElement("someProperty")]
public string SomeProperty { get; set; }
}
我的问题是我使用{$unwind:objectB}
汇总集合。结果文档在属性objectB
(不是列表)上具有唯一对象。
所以演员阵容失败了,例外:
反序列化类的ObjectB属性时发生错误 ObjectA:预期的元素名称为'_t',而不是 '编号'
我是否必须为此创建新模型,或者有更简单的方法来解决它?
答案 0 :(得分:1)
您也可以选择直接使用BsonDocument
(但这不是强类型的,并且使用起来比较麻烦),例如(我在这里使用简单的Posts
/ Tags
示例)
var aggregationResults = db.GetCollection("Posts").Aggregate().ResultDocuments;
foreach (var document in aggregationResults)
{
var tag = document.GetValue("Tags").AsString;
}
与普通的查询和投影运算符不同,聚合框架可能会更改文档的结构。正如您已经指出的那样,$unwind
将包含数组的文档转换为多个文档,每个文档都具有相同名称的单个值。
另一种方法是确实为此创建一个新类型,所以
class Post {
public List<string> Tags { get; set; }
...
会变成
class PostAggregationResult {
public string Tags { get; set; }
...
这很容易使用,但如果你有各种各样的聚合查询,你需要大量的类,这可能很烦人。