Как объединить коллекции по id с драйвером MongoDb C # - PullRequest
2 голосов
/ 01 июля 2019

Я пытаюсь объединить две коллекции 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; }

    }

1 Ответ

2 голосов
/ 01 июля 2019

Проблема в том, что когда вы запускаете "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.

...