В настоящее время у меня есть 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}},