Pruebe no correlacionado subconsulta de 3.6 para su caso de uso.
Algo como
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
para extraer los "blockedIds" para el ID de entrada seguido de $match
para filtrar los documentos en los que "_id" no está en la lista de identificadores bloqueados.
$expr
permite el uso de operadores de comparación de agregación en la etapa $match.
$arrayElemAt
para obtener el primer elemento de $lookup array.
$in
para comparar el _id con los bloqueados.
$project
con exclusión para eliminar el campo "noncr" de la respuesta final.
Tenga en cuenta que cuando pruebe la consulta use el nombre de la colección, no el modelo o el nombre del esquema en el atributo "desde" de la etapa de búsqueda.