【问题标题】:Unwind then Group aggregation in MongoDB C#在 MongoDB C# 中展开然后分组聚合
【发布时间】:2015-05-26 05:40:26
【问题描述】:

我在使用新的 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”的定义,并且找不到接受“BsonDocument”类型的第一个参数的扩展方法“FavouritePlaceIds”...

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    当您让Unwind 推断类型参数时,它将使用集合类型为TResultBsonDocumentTNewResult

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

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

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

    【讨论】:

    • 那么我需要将 OriginalType 和 NewResultType 设置为该字段所属的类,还是该字段的类型?
    • @Juzzbott 绝对不是那种类型的字段。 OrignalType 应该是集合类型。 NewResultType 应该是在 Unwind 中创建的投影类型。它应该可以使用相同的原始类型。
    • Class ApplicationUser 有 FavouritePlaceIds 字段。现在将编译以下内容,但我得到一个不同的错误:.Unwind&lt;ApplicationUser, ApplicationUser&gt;(i =&gt; i.FavouritePlaceIds)。错误消息是:无法从 BsonType 'String' 反序列化 'List'。
    • @Juzzbott 所以它不起作用。当您展开列表时,您会返回一个项目而不是列表,因此反序列化失败。您可以使用不同的类型,也可以使用单个项目进行序列化。
    • 所以当我运行以下命令时,没有 Group 和 Sort 子句,我得到了 3 个 BsonDocument 对象的集合:var pipeline = usersCollection.Aggregate().Unwind(i =&gt; i.FavouritePlaceIds); 有没有办法让 Unwind 方法返回 ApplicationUser 对象的集合,这样 .Group 方法可以工作吗? BsonDocument 对象包含 ApplicationUser 对象的所有值。或者,.Group 方法中是否有办法将“FavouritePlaceIds”指定为字符串而不是表达式?
    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多