2015-10-25 2 views
4

Я работаю над довольно большой базой MongoDB и задаюсь вопросом, есть ли более эффективный способ для некоторых запросов. Например, я храню много экземпляров Game в БДЕ, где Game класса выглядит следующим образом:MongoDB C# Драйвер соответственно. Linq: запрос для уникальных экземпляров и использование статических свойств AsQueryable

public class Game{ 
    [BsonId] 
    public long ID { get; set; } 

    // ... some more properties 

    public List<Player> Players { get; set; } 
} 

, где каждый экземпляр игра имеет список Player, который, в свою очередь, имеют некоторые свойства, как Name.

В одной модели просмотра я хочу связать ComboBox с именем всех игроков в базе данных, но помните, что один и тот же игрок мог сыграть много игр. Я загружаю их следующим образом:

private void LoadPlayersNames() { 
    var _l = StaticMongo.GetGames.SelectMany(n => n.Players).Select(n => n.Name); 
    PlayerNames = new ObservableCollection<string>(new HashSet<string>(_l)); 
} 

И в статическом классе StaticMongo У меня есть статический экземпляр MongoClient и IMongoDatabase, И я разоблачить GetGames недвижимость в StaticMongo следующим образом,

private readonly static IMongoDatabase _database; 
public static IMongoQueryable<DetailedHand> GetGames { 
    get { 
     return _database.GetCollection<Game>("Games").AsQueryable(); 
    } 
} 

Так чтобы сделать это более конкретным, следующие вопросы:

1: Я получаю уникальные имена игроков (через HashSet), или есть лучший способ запроса уникальных имен в этом контексте. 2: Имеет ли статический экземпляр MongoDB вместе с выставлением коллекций баз данных AsQueryable недостатки?

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

+0

Вы можете создать группу по имени игрока, а затем просто потянуть поле имени (вызов на стороне сервера MongoDb). Или вы можете вызвать Distinct() в Select. если вы хотите загрузить все эти данные из монго. –

+0

Это действительно быстрее? Я имею в виду группировку по имени, а затем вытаскивание имени только звучит как больше работы, хотя я не знаю, как работает метод linq в фоновом режиме - вместо того, чтобы получать данные негруппированными, а затем создавать хешсет на именах - опять же не зная, как эффективный конструктор hasthset. – EluciusFTW

+0

Вы пробовали добавить индексы ?? – user2527768

ответ

0

Я чувствую, вы должны использовать структуру агрегации для поиска уникальных имен, которые быстрее:

Чистого запрос Монго будет:

db.games.aggregate( 
    { 
     "$unwind": "$players" 
    }, 
    { 
     "$group": { 
      "_id": "$players.name",    
     } 
    } 
) 

Вы можете увидеть MongoDB Aggregation Framework Examples in C# для преобразования моего дб запроса к использованию C#.

Update:

Обучение aggregation in C# для вас. Верь мне или нет. Но агрегация выполняется быстрее, чем AsQueryable()

var collection = _database.GetCollection<BsonDocument>("games"); 
var pipeline = collection.Aggregate() 
    .Unwind(i => i.players) 
    .Group(new BsonDocument { { "_id", "$players.name" } }); 

Проверьте, не работает ли он.

+0

Ссылка, на которую вы ссылаетесь, использует более старую версию драйвера C#, которая принципиально отличается от ... – EluciusFTW

+0

@EluciusFTW: Я не знаю C#. Должны быть новые способы использования структуры агрегации в C#.Mongo Query отлично подходит для поиска уникальных имен игроков. См. Http://stackoverflow.com/a/33130160/1045444 –

+0

Мой вопрос был специфичен для C#, а точнее, если это хорошая идея, чтобы разоблачить коллекции как 'db.AsQueryable()' в свойстве статического класса и сохраняйте все ссылки на базы данных в этом классе, поэтому я пока не удовлетворен. – EluciusFTW

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