2016-02-17 4 views
0

У меня есть следующий кодоблок:C# MongoDB 2.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), но он, похоже, не работает. вопросы:

1. r имеет тип string который является вторым Project и игнорируя TeamRanks.

2. Как я могу получить только 5 лучших команд в порядке возрастания?

TIA.

EDIT

Я только сейчас заметил, что весь род, пропустить и ограничения сделаны на конкурсе, я хочу, чтобы применить на TeamRanks конечно. Так что если, например, метод получает счетчик = 7, а некоторые competitionId, метод должен вернуть конкуренцию с предоставленным идентификатору и внутри него верхние 7 команд заказали ..

ответ

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(); 

EDIT
Ниже приведен код, который получает первые пять элементов массива 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(); 
+0

Это неправильно. Я получаю весь документ здесь, его то, что я хочу предотвратить –

+0

, вы можете сортировать документы на корневом уровне, но сортировка элементов массива, когда вы выполняете поиск(), является сложной частью. Возможно, вам понадобится сделать агрегацию – IsaacBok

+0

Я не возражаю, сортируя ее при вводе. Просто нужен метод для получения первых пяти –

 Смежные вопросы

  • Нет связанных вопросов^_^