1 回答
TA贡献1812条经验 获得超5个赞
要在 C# 驱动程序中构建聚合管道,您有 3 个选项。
您可以使用 LINQ 进行聚合,但 LINQ 和 Mongo 查询语言之间并不总是 1:1 映射。
您可以使用驱动程序特定的
Builder
类。您可以使用
BsonDocument
构建器来构建“原始”聚合。使用此方法的类型安全性有限,或者没有类型安全性。
前两个选项要求您创建适当的类,因为编译器将强制执行类型安全。
您提供给选项 3 的聚合的“原始”转换相当简单,尽管有点冗长。
var foo = new BsonDocument("$project",
new BsonDocument("ExId", 1).Add("ArrayObject",
new BsonDocument("$map",
new BsonDocument("input", "$ArrayObject").Add("as", "itemA").Add("in",
new BsonDocument("Name", "$$itemA.Name").Add("$filter",
new BsonDocument("input", "$$itemA.FilterHere").Add("as", "item").Add("cond",
new BsonDocument("$eq", new BsonArray().Add("$$item.Sent").Add(true))))))));
不幸的是,由于我不知道你的输入类是什么样的,所以我很难直接将你的管道转换成代码。然而,查看表达式文档,它似乎$map
用于.Select
LINQ 并$filter
用于.Where
LINQ。这意味着,您的代码看起来像
col.Aggregate()
.Match(doc => ids.Contains(doc.ExId))
.Project(doc =>
new {
ExId = doc.ExId,
ArrayObject = doc.ArrayObject.Select(x =>
new
{
Name = x.Name,
FilterHere = x.FilterHere.Where(y => y.Sent == true)
})
});
因为我没有你的实际课程,所以我只能猜测它们是什么样子,这StartObject是我最好的猜测。
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报