在MongoDB C#中展开组聚合

时间:2015-05-26 05:40:26

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0

我在使用新的C#2.0 MongoDB驱动程序和聚合管道时遇到了一些麻烦。

基本上,我正在尝试返回对象上数组字段中最受欢迎的元素。字段类型为:IList<string> FavouritePlaceIds { get; set; }

我有以下MongoDB聚合,它按预期工作:

db.users.aggregate([
    { $unwind : "$FavouritePlaceIds" },
    { $group: { "_id": "$FavouritePlaceIds", "count": {$sum: 1}}}, 
    { $sort : { "count": -1 }}
])

然而,现在的问题是尝试使用新的MongoDB驱动程序2.0将其转换为C#代码。我一直在使用以下链接获取有关聚合管道的帮助:http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/crud/reading/#unwind

到目前为止,我已经为我的聚合管道提供了以下内容:

var pipeline = usersCollection.Aggregate()
                .Unwind(i => i.FavouritePlaceIds)
                .Group(i => i.FavouritePlaceIds, g => new { FavouritePlaceIds = g.Key, Count = g.Count() })
                .SortByDescending(i => i.Count);

当我编译该代码时,我收到以下消息:

  

'BsonDocument'不包含'FavouritePlaceIds'的定义,并且没有扩展方法'FavouritePlaceIds'可以找到类型'BsonDocument'的第一个参数...

Group()方法的第一个参数(i => i.FavouritePlaceIds)发生错误。

在小组部分提供的链接上阅读笔记时,它提到:

  

因为$ unwind是一种投影,所以你必须提供一个返回类型。

所以,我假设我没有指定正确的返回类型,这就是为什么它期望一个BsonDocument对象,并且无法编译。

那么,如何在Group方法中指定正确的返回类型?

1 个答案:

答案 0 :(得分:6)

当您Unwind推断出类型参数时,它会使用TResult的集合类型和BsonDocument的{​​{1}}。

如果您想使用特定类型而不是TNewResult,则需要添加以下类型参数:

BsonDocument

与往常一样,您需要确保操作实际上返回的内容可以是那种类型。