如何使用 MongoDb C# 驱动程序通过 id 加入 collections
How to join collections by id with MongoDb C# Driver
我正在尝试通过 Id
加入两个 collections。虽然我可以看到数据库中的行,但是查询结果是空的。
我有两个 collections:userGames
和 games
这是我的加入代码 collections:
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;
第一部分 return 有 13 个元素,但第二部分 return 没有。我认为 userGame.GameId equals game.Id
行有一些问题。尝试在 userGame.GameId
和 game.Id
上使用 ObjectId.Parse()
但没有成功。
这是我的模型
游戏Class:
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
,因此这些集合之间不会匹配。
最简单的解决方法是将 class 更改为:
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 or $toString 来转换类型,但是使用强类型驱动程序 API.
没有简单方便的方法来完成此操作
我正在尝试通过 Id
加入两个 collections。虽然我可以看到数据库中的行,但是查询结果是空的。
我有两个 collections:userGames
和 games
这是我的加入代码 collections:
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;
第一部分 return 有 13 个元素,但第二部分 return 没有。我认为 userGame.GameId equals game.Id
行有一些问题。尝试在 userGame.GameId
和 game.Id
上使用 ObjectId.Parse()
但没有成功。
这是我的模型
游戏Class:
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
,因此这些集合之间不会匹配。
最简单的解决方法是将 class 更改为:
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 or $toString 来转换类型,但是使用强类型驱动程序 API.
没有简单方便的方法来完成此操作