我在 Atlas 上有一个 MongoDB 数据库,其中保存了我读过的书籍的详细信息。 有两个集合:一个是作者集合,一个是书籍集合。
[BsonIgnoreExtraElements]
public class Author
{
[BsonId][BsonRepresentation(BsonType.ObjectId)] public ObjectId _id { get; set; }
[BsonElement("first")] public string? first { get; set; }
[BsonElement("last")] public string? last { get; set; }
[BsonElement("author_id")] public BsonInt32? author_id { get; set; }
[BsonElement("FullName")][BsonIgnoreIfNull] public string? FullName { get; set; }
}
[BsonIgnoreExtraElements]
public class Book
{
[BsonId][BsonRepresentation(BsonType.ObjectId)] public ObjectId _id { get; set; }
[BsonElement("title")] public string? title { get; set; }
[BsonElement("title_id")] public BsonInt32? title_id { get; set; }
[BsonElement("author")] public string? author { get; set; }
[BsonElement("issue_date")] public string? issue_date { get; set; }
[BsonElement("return_date")] public string? return_date { get; set; }
}
有 485 位作者和 1452 本书。该数据库提供使用 MAUI 创建的 Android 应用程序的数据。 其中一页提供了数据库中拥有最多书籍的作者的列表。 这使用 LINQ 组查询。
public async Task<List<Popular>> GetPopular()
{
IMongoQueryable<Popular>? query = (from book in booksCollection.AsQueryable()
group book by book.author into g
let lastBook = g.OrderByDescending(b => b.return_date).FirstOrDefault()
select new Popular
{
Author = g.Key,
Count = g.Count(),
ReturnDate = lastBook.return_date,
Title = lastBook.title
}).OrderByDescending(g => g.Count).ThenBy(g => g.Author).Take(10);
List<Popular>? popular = await query.ToListAsync();
return popular;
}
很多时候它会正确运行并生成列表。 但是,它确实会随机在 query.ToListAsync 语句上崩溃。
**MongoDB.Driver.Linq.Linq3Implementation.Ast.Optimizers.AstGroupingPipelineOptimizer+UnableToRemoveReferenceToElementsException:**
'Exception of type 'MongoDB.Driver.Linq.Linq3Implementation.Ast.Optimizers.AstGroupingPipelineOptimizer+UnableToRemoveReferenceToElementsException' was thrown.'
我使用 Visual Studio 17.11.4 和 MongoDB.Driver 2.9,默认使用 LINQ 3。 有没有一种简单的方法可以将查询转换为使用 Builders 或 BsonDocument,或者我使用的 LINQ 中是否有错误?
我在 Studio3T(3T Software Labs Ltd https://studio3t.com)的帮助下解决了这个问题。 这是一款用于构建 MongoDB 查询的优秀产品,具有免费版和专业版。 我已将链接替换为不会崩溃的 BsonDocument 查询!