Experimente não correlacionado subconsulta de 3.6 para seu 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 extrair os "blockedIds" para o ID de entrada seguido por $match
para filtrar os documentos onde "_id" não está na lista de blockIds. $expr
permite o uso de operadores de comparação de agregação no estágio $match. $arrayElemAt
para buscar o primeiro elemento do array $lookup. $in
para comparar o _id com os blockIds. $project
com exclusão para remover o campo "noncr" da resposta final. Observe que quando você testar a consulta, use o nome da coleção e não o nome do modelo ou do esquema no atributo "de" do estágio de pesquisa.