Dina ids
variabel kommer att konstrueras av "strängar" och inte ObjectId
värden.
Mongoose "autocasts" strängvärden för ObjectId
till sin korrekta typ i vanliga frågor, men detta händer inte i aggregeringspipelinen, som beskrivs i nummer #1399.
Istället måste du göra rätt gjutning för att skriva manuellt:
ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })
Sedan kan du använda dem i ditt pipelinestadium:
{ "$match": { "_id": { "$in": ids } } }
Anledningen är att aggregeringspipelines "vanligtvis" ändrar dokumentstrukturen, och därför gör mongoose ingen presumtion att "schemat" gäller dokumentet i ett givet pipelinestadium.
Det kan hävdas att det "första" pipelinesteget när det är en $match
scenen bör göra detta, eftersom dokumentet faktiskt inte ändras. Men just nu är det inte så det händer.
Alla värden som kan vara "strängar" eller åtminstone inte rätt BSON-typ måste castas manuellt för att matcha.