c# - 如何使用 MongoDb C# 驱动程序按 id 加入集合
问题描述
我正在尝试加入两个集合Id
。虽然我可以看到数据库中的行,但查询结果是空的。
我有两个系列:userGames
和games
这是我加入收藏的代码:
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
有问题。尝试ObjectId.Parse()
在两者上使用userGame.GameId
,game.Id
但没有运气。
这是我的模型
游戏类:
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; }
}
解决方案
问题是,当您运行“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 没有简单方便的方法来做到这一点。
推荐阅读
- excel - VBA中的转义字符
- c++ - Visual C++ (VS2017) 中的模糊用户定义转换
- python - SQLAlchemy 不可为空 ForeignKey 约束违反
- jakarta-ee - Wildfly 初始化:时间延迟导致 Java-EE 应用程序中的 IllegalStateException
- css - 如何将图标放入剑道菜单?
- .net - 添加编码以将 GridView 输出到 Word
- python - 在python中过滤与列表值匹配的列值的数据框
- macos - NSGraphicsContext becomes NULL after setting CAMetalLayer
- ios - pageViewController viewControllerAfter/Before dataSource 方法调用了两次
- c# - Xam.Plugins.Messaging,无法发送附件