使用 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?

HTTPS和SSH方式的区别和使用

学习和使用SVN和GitHub——开篇

CPU使用率和正在使用的内存之间有啥关系?

使用 Express 和 GraphQL 而不是简单地使用 Node.js 和 GraphtQL 有啥好处?