【问题标题】:How to join collections by id with MongoDb C# Driver如何使用 MongoDb C# 驱动程序按 id 加入集合
【发布时间】:2019-11-12 04:39:37
【问题描述】:

我正在尝试加入Id 的两个收藏。虽然可以看到数据库中的行,但是查询结果是空的。

我有两个集合:userGamesgames

这是我加入收藏的代码:

    var userGamesQuery = userGames.AsQueryable()
        .Where(x => x.UserId == userId);

    var query = from userGame in userGamesQuery
                join game in games.AsQueryable() on userGame.GameId equals game.Id
                select game;

第一部分返回 13 个元素,但第二部分不返回任何内容。我认为userGame.GameId equals game.Id 行有一些问题。尝试在userGame.GameIdgame.Id 上使用ObjectId.Parse(),但没有运气。

这是我的模型

游戏类:

public class Game
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }
    }

用户游戏:

public class UserGames
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }
        public string UserId { get; set; }
        public string GameId { get; set; }

    }

【问题讨论】:

  • 看看图书馆MongoDB.Entities。它具有对关系的内置支持,这使得创建和查询实体/文档之间的关系变得非常轻松。无需像上面那样创建像 UserGames 这样的连接实体或手动编写连接查询。

标签: c# mongodb mongodb.driver


【解决方案1】:

问题在于,当您运行“join”时,它会尝试在数据库端的两个字段上运行相等比较。考虑两个值相等 MongoDB 首先检查类型和十个值。由于GameId 的类型为string,而Id 存储为BsonId,因此这些集合之间将不匹配。

解决此问题的最简单方法是将您的课程更改为:

public class UserGames
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    public string UserId { get; set; }
    [BsonRepresentation(BsonType.ObjectId)]
    public string GameId { get; set; }
}

并在您的数据库上运行脚本以转换现有数据。可以是这样的:

db.UserGames.aggregate([
    { $addFields: { GameId: { $toObjectId: "$GameId" } } },
    { $out: "UserGames" }
])

您也可以尝试在聚合中直接使用 $toObjectId$toString 转换类型,但没有简单方便的方法可以使用强类型驱动程序 API 来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多