Prova non correlato sub query da 3.6 per il tuo caso d'uso.
Qualcosa come
User.aggregate(
[{$lookup:{
from: "users",
pipeline:[
{$match: {_id:mongoose.Types.ObjectId(id)}},
{$project: {_id:0,blockedIds:1}}
],
as: "noncr"
}},
{$match:{
$expr:{
$not:[
{$in:[
$_id,
{$arrayElemAt:["$noncr.blockedIds",0]}
]}
]
}
}},
{$project:{noncr:0}}]
)
$lookup
per inserire "blockedIds" per l'ID di input seguito da $match
per filtrare i documenti in cui "_id" non è nell'elenco degli ID bloccati.
$expr
consente l'utilizzo di operatori di confronto di aggregazione nella fase di $match.
$arrayElemAt
per recuperare il primo elemento dall'array $lookup.
$in
per confrontare _id con blockIds.
$project
con esclusione per rimuovere il campo "noncr" dalla risposta finale.
Tieni presente che quando esegui il test della query, utilizza il nome della raccolta non il nome del modello o il nome dello schema nell'attributo "da" della fase di ricerca.