我正在尝试使用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
舞台结果的类型。
块引用
答案 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