【问题标题】:C# mongodb 2.0 Find and project ordered part of an arrayC# mongodb 2.0 查找和投影数组的有序部分
【发布时间】:2016-02-17 13:38:45
【问题描述】:

我有以下代码块:

var r = this.collections.competitions.Find(filter)
                                             .Project(x => x.TeamRanks)
                                             .Project(t => t.Logo)
                                             .Sort(sort)
                                             .Skip(prev)
                                             .Limit(count)
                                             .Single();

我有这个 Competition 集合,它有 3 个字段

Class Competition {
           public ObjectId _Id;
           public string Logo;
           public List<string> TeamRanks
}

这里的过滤器位于Competition._Id。 我想按排名升序获得徽标和排名前 5 的团队。(由count 值给出) 该列表可能很大,所以我想在这里使用 Project(或使用 Fields 的替代解决方案),但它似乎无法正常工作。 问题:

1。 r 的类型为 string,这是第二个 Project,忽略了 TeamRank。

2。 如何才能只获得排名前 5 的队伍?

TIA。

编辑

我刚刚注意到整个排序、跳过和限制都是在比赛中完成的,我当然希望将其应用于 TeamRanks。 因此,例如,如果该方法接收到 count = 7 和一些 CompetitionId,则该方法需要返回具有提供的 id 的比赛,并在其中返回排名前 7 的球队。

【问题讨论】:

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


    【解决方案1】:
    ObjectId _idFilter = new ObjectId();//you set your _Id filter to whatever you need
    Competition _theCompetition = await __db.GetCollection<Competition>("Competiton")
        .Find(Builders<Competition>.Filter.Eq("_Id", _idFilter)).SingleAsync();
    int _count = 5; //your chosen count
    List<string> _orderedList = _theCompetition.TeamRanks
        .OrderBy(teamRank => teamRank).Take(_count).ToList();
    

    编辑
    下面是获取返回文档中 TeamRanks 数组前五个元素的代码

    var __projection = Builders<Competition>.Projection;
    var _theCompetition = await __db.GetCollection<Competition>("Competiton")
    .Find(Builders<Competition>.Filter.Eq("_id", _idFilter))                  
    .Project(__projection.Include(x=>x.Logo).Include(x=>x.TeamRanks).Slice("TeamRanks", 5))
    .SingleAsync();
    

    【讨论】:

    • 这是大错特错。我在这里获取整个文档,这是我想要阻止的
    • 您可以在根级别对文档进行排序,但是在执行 find() 时对数组元素进行排序是具有挑战性的部分。您可能需要进行聚合
    • 输入的时候不介意排序。只需要获取前五个的方法
    • 刚刚编辑了我的答案以包含使用带有切片的投影来获取数组的前 5 个元素的代码
    • 只是补充一下——在投影上链接的方法的顺序确实很重要。除非在包含语句之后调用,否则切片将无法正常工作。切片也可以写成 '.Slice(x=>x.TeamRanks, 5)' 而不是使用硬编码字符串。
    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2020-08-08
    • 2021-01-28
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多