我正在开发一个相当大的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
中,我有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 :(得分: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" } });
检查它是否正常工作。