taj*_*jay 5 c# aggregation mongodb
Mongo DB 的聚合管道有一个“AddFields”阶段,允许您将新字段投影到管道的输出文档,而无需知道哪些字段已存在。
似乎这尚未包含在 Mongo DB 的 C# 驱动程序中(使用版本 2.7)。
有谁知道是否有其他选择?也许是“项目”阶段的一面旗帜?
我不确定所有的BsonDocument用法都是必需的。当然不是在这个例子中,我将文本搜索的 textScore 附加到搜索结果中。
private IAggregateFluent<ProductTypeSearchResult> CreateSearchQuery(string query)
{
FilterDefinition<ProductType> filter = Builders<ProductType>.Filter.Text(query);
return _collection
.Aggregate()
.Match(filter)
.AppendStage<ProductType>("{$addFields: {score: {$meta:'textScore'}}}")
.Sort(Sort)
.Project(pt => new ProductTypeSearchResult
{
Description = pt.ExternalProductTypeDescription,
Id = pt.Id,
Name = pt.Name,
ProductFamilyId = pt.ProductFamilyId,
Url = !string.IsNullOrEmpty(pt.ShopUrl) ? pt.ShopUrl : pt.TypeUrl,
Score = pt.Score
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,ProductType确实有一个Score属性定义为
[BsonIgnoreIfNull]
public double Score { get; set; }
Run Code Online (Sandbox Code Playgroud)
不幸的是,它$addFields没有被直接支持,我们不得不求助于“魔术字符串”
正如此处所讨论的,在 C# MongoDB 驱动程序中使用 $addFields,您可以使用 BsonDocument 自行构建聚合阶段。
使用https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/中的示例
{
$addFields: {
totalHomework: { $sum: "$homework" } ,
totalQuiz: { $sum: "$quiz" }
}
}
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
BsonDocument expression = new BsonDocument(new List<BsonElement>() {
new BsonElement("totalHomeWork", new BsonDocument(new BsonElement("$sum", "$homework"))),
new BsonElement("totalQuiz", new BsonDocument(new BsonElement("$sum", "$quiz")))
});
BsonDocument addFieldsStage = new BsonDocument(new BsonElement("$addFields", expression));
IAggregateFluent<BsonDocument> aggregate = col.Aggregate().AppendStage(addFieldsStage);
Run Code Online (Sandbox Code Playgroud)
表达式是 BsonDocument 代表
{
totalHomework: { $sum: "$homework" } ,
totalQuiz: { $sum: "$quiz" }
}
Run Code Online (Sandbox Code Playgroud)
您可以像往常一样将其他阶段附加到 IAggregateFluent 对象上
IAggregateFluent<BsonDocument> aggregate = col.Aggregate()
.Match(filterDefintion)
.AppendStage(addFieldsStage)
.Project(projectionDefintion);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3509 次 |
| 最近记录: |