0

我有以下代码块:

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 的替代解决方案),但它可以t 似乎工作。问题:

1. 属于第二个r类型,忽略 TeamRanks。stringProject

2. 怎样才能只获得排名前5的队伍?

TIA。

编辑

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

4

1 回答 1

2
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();
于 2016-02-18T20:19:54.473 回答