c# - 在 MongoDB C# 中展开然后分组聚合

标签 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' 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) 出现错误。

阅读小组部分下提供的链接中的注释,它提到:

Because $unwind is a type of projection, you must provide a return type.

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

那么,我怎样才能在 Group 方法中指定正确的返回类型呢?

最佳答案

当你让 Unwind 推断类型参数时,它将使用 TResult 的集合类型和 TNewResultBsonDocument >.

如果你想使用特定类型而不是 BsonDocument 你需要添加这些类型参数:

var pipeline = usersCollection.Aggregate()
    .Unwind<OriginalType, NewResultType>(....

与往常一样,您需要确保操作实际返回的内容可能属于该类型。

关于c# - 在 MongoDB C# 中展开然后分组聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30450281/

相关文章:

c# - 为什么 LsaAddAccountRights 会返回 STATUS_INVALID_PARAMETER?

c# - 单声道错误格式异常但不是在 Windows 上

MongoDB 3.6.2 2008R2 Plus 未安装

ruby-on-rails-3 - ruby on Rails 中变量后面的感叹号是什么意思?

c# - 通用列表未插入到 MongoDB 中

c# - 如何使用 MongoDB 的官方 C# 驱动程序检索所有嵌入式文档值?

C# 事件内存泄漏

c# - 如何通过属性名称调用属性的方法

mongodb - 检查字段是否包含字符串

c# - 使用 c# 驱动程序 2.2.3 关闭 mongoDb 服务器