Mongo C# Fluent 聚合管道组匿名类型键异常

mongodb

1个回答

写回答

Lj33197714

2025-06-19 08:35

+ 关注

MongoDB
MongoDB

MongoDB是一款非常流行的NoSQL数据库,而C#是一种广泛使用的编程语言。为了方便与MongoDB进行交互,MongoDB官方提供了一个名为MongoDB C# Driver的驱动程序。在这个驱动程序中,有一个名为Fluent的功能,它允许我们以一种更加流畅的方式构建查询和聚合管道。

然而,在使用MongoDB C# Fluent进行聚合管道时,我们可能会遇到一个异常,即"组匿名类型键异常"。这个异常的原因是在聚合管道中使用匿名类型作为分组的键,而MongoDB C# Driver不支持将匿名类型作为键。

为了更好地理解这个异常,并找到解决方法,让我们来看一个具体的案例。

首先,我们需要在C#项目中安装MongoDB C# Driver。可以通过NuGet包管理器搜索并安装"MongoDB.Driver"包。

接下来,我们将创建一个名为"Books"的集合,并插入一些示例数据。每个文档包含书籍的标题、作者和出版日期。

csharp

using MongoDB.Bson;

using MongoDB.Driver;

using System;

using System.Collections.Generic;

namespace MongoCSharpFluentAggregation

{

class Program

{

static void MAIn(string[] args)

{

// 连接到MongoDB服务器

var client = new MongoClient("MongoDB://localhost:27017");

// 获取数据库

var Database = client.GetDatabase("test");

// 获取集合

var collection = Database.Getcollection<BsonDocument>("Books");

// 插入示例数据

var documents = new List<BsonDocument>

{

new BsonDocument { { "Title", "Book 1" }, { "Author", "Author 1" }, { "PublicationDate", new DateTime(2022, 1, 1) } },

new BsonDocument { { "Title", "Book 2" }, { "Author", "Author 2" }, { "PublicationDate", new DateTime(2022, 2, 1) } },

new BsonDocument { { "Title", "Book 3" }, { "Author", "Author 1" }, { "PublicationDate", new DateTime(2022, 3, 1) } },

new BsonDocument { { "Title", "Book 4" }, { "Author", "Author 2" }, { "PublicationDate", new DateTime(2022, 4, 1) } }

};

collection.InsertMany(documents);

Console.WriteLine("数据插入成功。");

// 执行聚合管道

var pipeline = new[]

{

BsonDocument.Parse("{ $group: { _id: { Author: \"$Author\" }, Count: { $sum: 1 } } }"),

BsonDocument.Parse("{ $sort: { Count: -1 } }")

};

var result = collection.Aggregate<BsonDocument>(pipeline).ToList();

// 输出结果

Console.WriteLine("聚合结果:");

foreach (var document in result)

{

Console.WriteLine(document);

}

Console.ReadLine();

}

}

}

在上述代码中,我们首先连接到MongoDB服务器,并获取了名为"test"的数据库和"Books"的集合。然后,我们插入了一些示例数据,包含了书籍的标题、作者和出版日期。

接着,我们构建了一个聚合管道。在这个聚合管道中,我们使用了$group阶段来按作者进行分组,并使用$sum操作符计算每个作者的书籍数量。然后,我们使用$sort阶段来按书籍数量降序排序。

最后,我们执行聚合管道并输出结果。可以看到,我们成功地按作者分组并计算了每个作者的书籍数量。

不过,如果我们想要将结果中的作者和书籍数量封装为一个匿名类型,并作为分组的键,就会遇到"组匿名类型键异常"。

为了解决这个异常,我们可以使用BsonDocument类来代替匿名类型作为分组的键。修改聚合管道如下:

csharp

var pipeline = new[]

{

BsonDocument.Parse("{ $group: { _id: { Author: \"$Author\" }, Count: { $sum: 1 } } }"),

BsonDocument.Parse("{ $project: { _id: 0, Author: \"$_id.Author\", Count: 1 } }"),

BsonDocument.Parse("{ $sort: { Count: -1 } }")

};

在上述修改后的聚合管道中,我们使用$project阶段将分组键中的作者字段提取出来,并将其命名为"Author"。然后,我们执行聚合管道并输出结果,可以看到我们成功地按作者分组并计算了每个作者的书籍数量,并且结果以作者和书籍数量的形式输出。

解决"组匿名类型键异常"的方法

在上述案例中,我们使用BsonDocument类作为分组的键来解决了"组匿名类型键异常"。这是因为MongoDB C# Driver不支持将匿名类型作为键。因此,当我们在使用MongoDB C# Fluent进行聚合管道时,应该注意避免使用匿名类型作为分组的键。

在使用MongoDB C# Fluent进行聚合管道时,我们可能会遇到"组匿名类型键异常"。为了解决这个异常,我们应该避免使用匿名类型作为分组的键,并使用BsonDocument类作为分组的键来代替。

希望本文对你理解并解决"组匿名类型键异常"有所帮助!

如果你对这个问题还有任何疑问,欢迎留言讨论。感谢阅读!

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号