使用 ProjectionDefinition 和 c# 驱动程序的 Mongodb 组聚合
Posted
技术标签:
【中文标题】使用 ProjectionDefinition 和 c# 驱动程序的 Mongodb 组聚合【英文标题】:Mongodb group aggregation using ProjectionDefinition with c# driver 【发布时间】:2016-12-21 22:24:43 【问题描述】:我正在尝试使用 2.2 版本的驱动程序来创建聚合查询,使用匹配阶段的 FilterDefintion 和组阶段的 ProjectionDefinition。但我不太确定如何创建 ProjectionDefinition。 API 是这样的:
FilterDefinition<T> filter=Builders<T>.Filter.Eq("Foo","Bar");
ProjectionDefinition<T> projection=...
IAggregateFluent<T> aggr = fileCol.Aggregate<T>()
.Match(filter)
.Group(projection);
匹配过滤器的工作方式与普通查找一样。但我不确定如何创建投影。
我可以只创建一个普通的 Bson 文档并将其放在那个阶段,它就可以工作。但是我正在尝试使用来自构建器的强类型对象创建一个一致的界面,这是我无法弄清楚如何做到这一点的一个地方。我认为这是可能的,因为 API 存在。
(小组阶段的Bson文件可以做成这样):
projection = new BsonDocument("_id","$SomeIdField").
Add("Result",new BsonDocument("$max","$someNumberField"));
编辑: 我所指的MongoDB API链接如下,我引用了相关部分。没有提供示例。我同意 'GroupDefinition' 会更有意义,但我没有写它 :-) 强类型,我的意思是用返回值键入,而不是 BsonDocument。
http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_AggregateFluentBase_1_Group__1.htm
块引用
public abstract IAggregateFluent<TNewResult> Group<TNewResult>(
ProjectionDefinition<TResult, TNewResult> group
)
参数
组 类型:MongoDB.Driver.ProjectionDefinitionTResult, TNewResult>
组投影。
类型参数
TNewResult
阶段结果的类型。
块引用
【问题讨论】:
ProjectionDefinition
在分组阶段??这听起来不对。它本身就是一个舞台,就像比赛一样。顺便说一句 BsonDocument
是强类型的。如果它只是一个键值对 BsonDocument
是您的对象,我认为对于累加器运算符,您已经拥有可以使用的包装器。
@SagarReddy,我同意它令人困惑,但这就是 mdb 文档的方式。我已经链接了问题中的相关部分。
【参考方案1】:
AggregateGroupTranslatorTests.cs 上有一些很好的示例,这是MongoDB .NET Driver: aggregation group 的测试文件。
例如,如果你有这个类定义:
public class ExampleGroup
[BsonId]
public ObjectId Id get;set;
public string SomeStringField get; set;
public int SomeNumberField get; set;
你想对
进行分组 _id: "$SomeStringField", Result: "$max": "$SomeNumberField"
你可以执行如下:
var result = collection.Aggregate()
.Group(
x => x.SomeStringField,
g => new
Result = g.Select(
x => x.SomeNumberField
).Max()
).ToList();
result.ForEach(doc => Console.WriteLine(doc.ToJson()));
上述 sn-p 在 .Net 4.5、MongoDB 3.4 和 MongoDB .Net/C# Driver v2.3 上进行了测试。我知道您使用的是 v2.2,但项目定义分组没有(或任何)更改。
还可以查看其他 LINQ 转换器测试 MongoDB.Driver.Tests/Linq/Translators
【讨论】:
我错过了这个问题的回答,抱歉迟到了。我不想使用 LINQ,但我没有在原帖中这么说。以上是关于使用 ProjectionDefinition 和 c# 驱动程序的 Mongodb 组聚合的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 php 和 mysql 使用纬度和经度进行几何搜索
Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?