C#和MongoDriver-如何从国外集合中获取值(聚合+查找)?

时间:2019-12-08 16:25:58

标签: c# mongodb

使用C#从国外集合中获取值时遇到问题。 在这种情况下,我可以轻松地从列表中获取值:

var gamesList = gamesCollection.Find(_ => true).ToList();
foreach (var item in gamesList)
{
     Console.WriteLine($"{item.Title}");

}   

但是当我使用带有查找功能的聚合时,我无法访问外部集合中的值。 这是我尝试加入的两个收藏夹:

public class GameModel
{
    [BsonId]
    public ObjectId Id { get; set; }
    public string Title { get; set; }
    public List<String> Type { get; set; }
    public string GameMode { get; set; }
    public List<String> Platform { get; set; }
    public string Production { get; set; }
}

public class FavouriteGameModel
{
    [BsonId]
    public ObjectId Id { get; set; }
    public ObjectId UserID { get; set; }
    public ObjectId GameID { get; set; }
}

这是有问题的代码的一部分:

var joinedFavGamesList = favouriteGamesCollection.Aggregate().Match(x => x.UserID == loggedUser[0].Id).//ToList();
                        Lookup("Games", "GameID", "_id", @as: ("myAlias")).
                        Project(
                            new BsonDocument { { "_id", 0 }, { "myAlias.Title", 1 } }
                        ).ToList();

有什么方法可以调用myAlias.Title吗?我只希望显示此值,但我得到: {“ myAlias”:[{“ Title”:“ Some Game”}]}

如果有人可以看一下并告诉我我做错了,我将非常感激。谢谢

1 个答案:

答案 0 :(得分:1)

我的选择是像这样使用AsQueryable界面加入/查找:

var favGames = favCollection.AsQueryable()
                            .Where(fg=> fg.UserID== "xxxxxxxxxxx")
                            .Join(gameCollection.AsQueryable(), //foreign collection
                                  fg => fg.GameID,              //local field
                                  gm => gm.ID,                  //foreign field
                                  (fg, gm) => new { gm.Title }) //projection
                            .ToList();

具有聚合接口:

public class JoinedGameModel
{
    public GameModel[] Results { get; set; }
}
var favGames = favGameCollection.Aggregate()
                   .Match(fg => fg.UserID == "xxxxxxxxxxxx")
                   .Lookup<FavouriteGameModel, GameModel, JoinedGameModel>(
                       gameCollection, 
                       fg => fg.GameID, 
                       gm => gm.ID, 
                       jgm => jgm.Results)
                   .ReplaceRoot(jgm => jgm.Results[0])
                   .Project(gm => new { gm.Title })
                   .ToList();