MongoDB 聚合查询计数
MongoDB aggregate query count
我正在使用 MongoDB 和 C# 制作应用程序。我使用 MongoDB C# 驱动程序。我有以下 collection:
{
_id: 5099803df3f4948bd2f98391,
title: Toy Story,
genres: [ "Animation", "Comedy" ]
},
{
_id: 5099803df3f4948bd2f98392,
title: Minions,
genres: [ "Animation", "Comedy", "Action" ]
}
现在我想查询数据并获取每种类型的电影数量。所以结果应该是:
Animation: 2
Comedy: 2
Action: 1
我正在尝试使用此代码实现此目的。
database.GetCollection<Movie>("Movies")
.Aggregate()
.Unwind<Movie>(x => x.Genres)
.Group(x=>x.Genres, g => new
{
Genre= g.Key,
Count = g.Select(x=>x.Genres).Count()
}).ToList();
改了好多次都没成功
.Group()
在这里用于构建一个表达式,该表达式被翻译到聚合的框架 $group
管道阶段。问题是 MongoDB 的语法与您在 LINQ 中的语法有点不同,因此您应该在这里多考虑 "MongoDB way"。
从技术上讲,$group
将为您提供包含两个字段的文档集合:_id
(这就是分组键被翻译成的内容)和 Count
。因此,要修复您的查询,您可以引入如下简单类型:
public class GenreStats
{
[BsonElement("_id")]
public string Genre { get; set; }
public int Count { get; set; }
}
然后使用该类型反序列化您的聚合结果:
database.GetCollection<Movie>("Movies")
.Aggregate()
.Unwind<Movie, Movie>(x => x.Genres)
.Group(x=>x.Genres, g => new
{
Count = g.Count()
}).As<GenreStats>().ToList();
我正在使用 MongoDB 和 C# 制作应用程序。我使用 MongoDB C# 驱动程序。我有以下 collection:
{
_id: 5099803df3f4948bd2f98391,
title: Toy Story,
genres: [ "Animation", "Comedy" ]
},
{
_id: 5099803df3f4948bd2f98392,
title: Minions,
genres: [ "Animation", "Comedy", "Action" ]
}
现在我想查询数据并获取每种类型的电影数量。所以结果应该是:
Animation: 2
Comedy: 2
Action: 1
我正在尝试使用此代码实现此目的。
database.GetCollection<Movie>("Movies")
.Aggregate()
.Unwind<Movie>(x => x.Genres)
.Group(x=>x.Genres, g => new
{
Genre= g.Key,
Count = g.Select(x=>x.Genres).Count()
}).ToList();
改了好多次都没成功
.Group()
在这里用于构建一个表达式,该表达式被翻译到聚合的框架 $group
管道阶段。问题是 MongoDB 的语法与您在 LINQ 中的语法有点不同,因此您应该在这里多考虑 "MongoDB way"。
从技术上讲,$group
将为您提供包含两个字段的文档集合:_id
(这就是分组键被翻译成的内容)和 Count
。因此,要修复您的查询,您可以引入如下简单类型:
public class GenreStats
{
[BsonElement("_id")]
public string Genre { get; set; }
public int Count { get; set; }
}
然后使用该类型反序列化您的聚合结果:
database.GetCollection<Movie>("Movies")
.Aggregate()
.Unwind<Movie, Movie>(x => x.Genres)
.Group(x=>x.Genres, g => new
{
Count = g.Count()
}).As<GenreStats>().ToList();