Seus
ids
variável será construída de "strings", e não ObjectId
valores. Valores de string "autocasts" do Mongoose para
ObjectId
em seu tipo correto em consultas regulares, mas isso não acontece no pipeline de agregação, conforme descrito no problema #1399. Em vez disso, você deve fazer a conversão correta para digitar manualmente:
ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })
Então você pode usá-los em seu estágio de pipeline:
{ "$match": { "_id": { "$in": ids } } }
A razão é porque os pipelines de agregação "normalmente" alteram a estrutura do documento e, portanto, o mangusto não assume que o "esquema" se aplica ao documento em qualquer estágio do pipeline.
É discutível que o "primeiro" estágio do pipeline quando é um
$match
estágio deve fazer isso, pois de fato o documento não é alterado. Mas agora não é assim que acontece. Quaisquer valores que possam ser "strings" ou pelo menos não o tipo BSON correto precisam ser convertidos manualmente para corresponder.