我正在尝试通过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; }
}
UserGames:
public class UserGames
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string UserId { get; set; }
public string GameId { get; set; }
}
答案 0 :(得分:2)
问题在于,当您运行“ 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来实现。