如何使用mongodb和c#在子元素中使用聚合函数?

时间:2016-06-04 13:42:38

标签: c# mongodb grouping

我有一个c#类是一个庞大的集合:

public class Usuario_Series_Episodios
{
   public void Dispose()
    {
        GC.SuppressFinalize(this);
    }
    [BsonId]
    public ObjectId _id { get; set; }

    public int Usuario_Id { get; set; }

    public int Serie_Id { get; set; }

    public IList<EpisodiosVistos> EpisodiosVistos { get; set; }
}

public class Episodes : Entity
{
    public virtual int User_Id { get; set; }
    public virtual string  User_Name { get; set; }
    public virtual int Serie_Id { get; set; }
    public virtual string Cod_Serie { get; set; }
    public virtual int Episode { get; set; }
    public virtual string Cod_Eps { get; set; }
    public virtual DateTime Date { get; set; }
}

我需要查询按照系列分组的上周观看次数最多的剧集,我的结果需要按降序排序如下:

Serie_id - 剧集 - 计数

1 -------------- 2 ---------- 20

3 -------------- 4 ---------- 19

1 -------------- 3 ---------- 18

所以我做了以下代码:

var collection =db.GetCollection<BsonDocument>("Usuario_Series_Episodios");
var aggregate = collection.Aggregate()
           .Group(
            new BsonDocument {
                { "_id", "$EpisodiosVistos.Serie_Id" },
                { "episodio", "$EpisodiosVistos.Episode" },
                { "count", new BsonDocument("$sum", 1) }
            });

var results = await aggregate.SortByDescending(bson => bson["count"]).ToListAsync();

但出现以下错误:

  

命令聚合失败:组聚合字段'episodio'必须是   定义为对象内的表达式。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

我不太熟悉MongoDB的.NET驱动程序,但下面是这个想法:

var aggregate = collection.Aggregate()
               .Group(
                new BsonDocument {
                    { "_id", new BsonDocument{{ "series", "$Serie_Id"}, { "episodio", "$EpisodiosVistos.Episode" }} },
                    { "count", new BsonDocument("$sum", 1) }
                });

如果要按多个字段进行分组,则需要将它们都包含在_id字段中以进行分组。之后的所有字段都是需要表达某种类型的累加器,这就是编译器抱怨episodio不是表达式的原因。