MongoDB C#Driver resp.Linq:查询唯一实例并使用静态 AsQueryable 属性
本文关键字:静态 属性 AsQueryable 实例 唯一 resp C#Driver Linq 查询 MongoDB | 更新日期: 2023-09-27 18:19:05
我正在处理一个相当大的MongoDB数据库,想知道是否有更有效的方法进行某些查询。例如,我在数据库中存储了许多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
的静态实例,并且我在StaticMongo
中公开了GetGames
属性,如下所示:
private readonly static IMongoDatabase _database;
public static IMongoQueryable<DetailedHand> GetGames {
get {
return _database.GetCollection<Game>("Games").AsQueryable();
}
}
因此,为了使这一点更加简洁,请提出以下问题:
1:我获取唯一玩家名称(通过HashSet
(的方式是一种好方法,还是在这种情况下有更好的方法来查询唯一名称。阿拉伯数字:静态MongoDB实例以及公开数据库集合AsQueryable是否有缺点?
我知道公式可能有点基于意见,但我希望得到一些替代方法来进行此类查询,因为这对我来说似乎不是理想的方式。
我觉得你应该使用聚合框架来查找唯一名称,这更快:
纯 mongo 查询将是:
db.games.aggregate(
{
"$unwind": "$players"
},
{
"$group": {
"_id": "$players.name",
}
}
)
您可以在 C# 中查看 MongoDB 聚合框架示例,用于将我的数据库查询转换为 C# 用法。
更新:
学习 C# 中的聚合。信不信由你。但是聚合比AsQueryable((更快
var collection = _database.GetCollection<BsonDocument>("games");
var pipeline = collection.Aggregate()
.Unwind(i => i.players)
.Group(new BsonDocument { { "_id", "$players.name" } });
检查它是否正常工作。