MongoDB C#Driver resp。 Linq:查询唯一实例并使用静态AsQueryable属性

时间:2015-10-25 11:53:25

标签: c# mongodb linq

我正在开发一个相当大的MongoDB数据库,我想知道是否有更有效的方法来处理某些查询。例如,我在db中存储了大量Game实例,其中Game类如下所示:

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中,我有MongoClientIMongoDatabase的静态实例,并且我在GetGames中公开StaticMongo属性为如下,

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

因此,为了让这更加贴心,请遵循以下问题:

1:我获取独特玩家名称的方式(通过HashSet)是一种好方法,还是有更好的方法来查询此上下文中的唯一名称。 2:静态MongoDB实例以及公开数据库集合AsQueryable是否有缺点?

我知道这个公式可能有点基于意见,但我希望能找到一些其他方法来进行此类查询,因为这对我来说似乎不是理想的方法。

1 个答案:

答案 0 :(得分:0)

我觉得你应该使用聚合框架来寻找更快的唯一名称:

纯mongo查询将是:

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

您可以看到MongoDB Aggregation Framework Examples in C#将我的数据库查询转换为C#用法。

<强>更新

为您学习aggregation in C#。信不信由你。但聚合比AsQueryable()

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

检查它是否正常工作。