Если вы хотите ввести userId
для исключения в качестве переменной, aggregate()
с $lookup
, скорее всего, сработает:
let loggedInUser = 'Eladian'
ListingModel.aggregate([
{
// $lookup is instead of .populate() but does roughly the same thing,
// bringing in the data from the listingLikes table
'$lookup': {
'from': 'listingLikesModel',
'localField': 'listingLikes',
'foreignField': '_id',
'as': 'listingLikes'
}
}, {
// $lookup puts its results in an array in your table.
// We flatten it using $unwind
'$unwind': '$listingLikes'
}, {
// $match is equivalent to 'where'
'$match': {
'listingLikes.userId': {
'$ne': loggedInUser
}
}
}, {
// limit to 10 results
'$limit': 10
}
])
В качестве альтернативы, вы можете добавить $ конвейер к$ lookup, который, как я считаю, будет более эффективным и позволит вам ввести userId из ListingModel или из любого другого места, где он может храниться:
ListingModel.aggregate([
{
'$lookup': {
'from': 'listingLikesModel',
// below assumes there is a 'userId' field in ListingModel,
// which we put in to a variable (listingUserId) so we can use it in
// the pipeline
'let': {'listingUserId': '$userId'},
'pipeline': [
{
'$match': {
'$expr': {
'$ne': [ '$userId', '$$listingUserId']
}
}
},
{ '$limit': 10 }
],
// It puts the 10 posts in an array called 'notLikedList' in the ListingModel
'as': 'notLikedList'
}
}
])
Подробнее о конвейерах $ lookup здесь