使用带有c#驱动程序

时间:2016-12-21 22:24:44

标签: c# mongodb aggregation-framework

我正在尝试使用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.ProjectionDefinition&lt; TResult,TNewResult &gt;

小组投射。

类型参数

TNewResult

舞台结果的类型。

  

块引用

1 个答案:

答案 0 :(得分:7)

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()));

上述代码段在.Net 4.5,MongoDB 3.4和MongoDB .Net / C#Driver v2.3上进行了测试。我知道您正在使用v2.2,但项目定义分组没有(或任何)更改。

另请参阅其他LINQ翻译测试MongoDB.Driver.Tests/Linq/Translators