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

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

因此,为了使这一点更加简洁,请提出以下问题:

1:我获取唯一玩家名称(通过HashSet(的方式是一种好方法,还是在这种情况下有更好的方法来查询唯一名称。阿拉伯数字:静态MongoDB实例以及公开数据库集合AsQueryable是否有缺点?

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

MongoDB C#Driver resp.Linq:查询唯一实例并使用静态 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" } });

检查它是否正常工作。