Mongodb многие ко многим получают от пользователя - PullRequest
0 голосов
/ 16 апреля 2020

В настоящее время у меня есть 3 схемы:

Пользователь Схема:

var UserSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    ...
});
module.exports = mongoose.model('User', UserSchema);

Избранное (Эта схема содержит доступные избранное в системе ):

var FavoriteSchema = new Schema({
    storeId: {
        type: String,
        auto: true
    },
    name: {
        type: String,
        required: true
    }
    ...
});

module.exports = mongoose.model('Favorite', FavoriteSchema);

UserFavorite (Предполагается, что эта схема будет использоваться для хранения избранного, которое пользователь определил)

var UserFavoriteSchema = new Schema({
    favoriteId: {
        type: Schema.ObjectId,
        required: true
    },
    userId: {
        type: Schema.ObjectId,
        required: true
    },
    status: {
        type: Number
    }
});

module.exports = mongoose.model('UserFavorite', UserFavoriteSchema);

Каждый раз, когда пользователь добавляет избранное элемент (из коллекции Favorite). Я сохраню идентификатор в UserFavorite.

Моя проблема: я пытаюсь получить все избранные данные от данного пользователя (все сведения из Favorite, представленные в UserFavorite).

Вот мой код:

Favorite.aggregate([

            {$match: {status: 1}},
            {
                $lookup: {
                    from: 'userfavorites',
                    // let: {primaryUser: userId},
                    pipeline: [
                        {$match: {userId: mongoose.Types.ObjectId('5e9576668061fc5d3ba9caeb')}},

                        {$project: {_id: 0, status: "$status", favoriteId: 1}}
                    ],
                    as: 'getUserFavorites'
                }
            },

            $addFields: {
               _favoriteIds: {$map: {input: "$getUserFavorites", as: "eu", in: "$$eu.favoriteId"}},
            }
            {$match: {_id: {$in: "$_favoriteIds"}}},//<-- Error $in must array but in result is Array?!
            {$sort: {createAt: -1}},

])
.then(favorites => favorites)
.catch(err => console.error("getAllMyFavorite  Catch", err));

Я хочу получить все по userId и объединить статус UserFavorite. Как я могу заставить его работать? Или какое-нибудь предложение? Заранее спасибо!

ОБНОВЛЕНИЕ Нахожу ответ:


    {
                $lookup: {
                    from: 'userfavorites',
                    let: {primaryEventId: "$_id"},
                    pipeline: [
                        {$match: {userId: mongoose.Types.ObjectId(userId)}},
                        {$match: {$expr: {$eq: ["$$primaryEventId", "$favoriteId"]}}},
                        {$project: {_id: 0, status: "$status"}},
                    ],
                    as: 'getUserFavorites'
                }
            },
            {$unwind: {path: "$getUserFavorites", preserveNullAndEmptyArrays: false}},

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...