在 MongoDB C# 中展开然后分组聚合
Unwind then Group aggregation in MongoDB C#
我在使用新的 C# 2.0 MongoDB 驱动程序和聚合管道时遇到了一些问题。
基本上,我正在尝试 return 对象上数组字段中最流行的元素。字段类型为:IList<string> FavouritePlaceIds { get; set; }
.
我有以下 MongoDB 聚合,它按预期工作:
db.users.aggregate([
{ $unwind : "$FavouritePlaceIds" },
{ $group: { "_id": "$FavouritePlaceIds", "count": {$sum: 1}}},
{ $sort : { "count": -1 }}
])
但是,问题现在是尝试使用新的 MongoDB 驱动程序 2.0 将其转换为 C# 代码。我一直在使用以下 link 来帮助聚合管道: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' does not contain a definition for 'FavouritePlaceIds' and no extension method 'FavouritePlaceIds' accepting a first argument of type 'BsonDocument' could be found...
错误发生在 Group() 方法的第一个参数 (i => i.FavouritePlaceIds
) 上。
阅读组部分下提供的 link 中的注释,它提到:
Because $unwind is a type of projection, you must provide a return type.
所以,我假设我没有指定正确的 return 类型,这就是为什么它需要一个 BsonDocument 对象,但无法编译。
那么,如何指定要在 Group 方法中使用的正确 return 类型?
当您让 Unwind
推断类型参数时,它将使用 TResult
的集合类型和 TNewResult
的 BsonDocument
。
如果您想使用特定类型而不是 BsonDocument
,您需要添加这些类型参数:
var pipeline = usersCollection.Aggregate()
.Unwind<OriginalType, NewResultType>(....
一如既往,您需要确保操作确实 returns 可以是那种类型的东西。
我在使用新的 C# 2.0 MongoDB 驱动程序和聚合管道时遇到了一些问题。
基本上,我正在尝试 return 对象上数组字段中最流行的元素。字段类型为:IList<string> FavouritePlaceIds { get; set; }
.
我有以下 MongoDB 聚合,它按预期工作:
db.users.aggregate([
{ $unwind : "$FavouritePlaceIds" },
{ $group: { "_id": "$FavouritePlaceIds", "count": {$sum: 1}}},
{ $sort : { "count": -1 }}
])
但是,问题现在是尝试使用新的 MongoDB 驱动程序 2.0 将其转换为 C# 代码。我一直在使用以下 link 来帮助聚合管道: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' does not contain a definition for 'FavouritePlaceIds' and no extension method 'FavouritePlaceIds' accepting a first argument of type 'BsonDocument' could be found...
错误发生在 Group() 方法的第一个参数 (i => i.FavouritePlaceIds
) 上。
阅读组部分下提供的 link 中的注释,它提到:
Because $unwind is a type of projection, you must provide a return type.
所以,我假设我没有指定正确的 return 类型,这就是为什么它需要一个 BsonDocument 对象,但无法编译。
那么,如何指定要在 Group 方法中使用的正确 return 类型?
当您让 Unwind
推断类型参数时,它将使用 TResult
的集合类型和 TNewResult
的 BsonDocument
。
如果您想使用特定类型而不是 BsonDocument
,您需要添加这些类型参数:
var pipeline = usersCollection.Aggregate()
.Unwind<OriginalType, NewResultType>(....
一如既往,您需要确保操作确实 returns 可以是那种类型的东西。