Twoje ids
zmienna zostanie zbudowana z "ciągów", a nie ObjectId
wartości.
Mongoose „autocasty” wartości ciągu znaków dla ObjectId
do prawidłowego typu w zwykłych zapytaniach, ale nie dzieje się tak w potoku agregacji, jak opisano w numerze #1399.
Zamiast tego musisz wykonać prawidłowe przesyłanie, aby pisać ręcznie:
ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })
Następnie możesz ich użyć na etapie potoku:
{ "$match": { "_id": { "$in": ids } } }
Powodem jest to, że potoki agregacji „zwykle” zmieniają strukturę dokumentu, a zatem mangusta nie zakłada, że „schemat” ma zastosowanie do dokumentu na dowolnym etapie potoku.
Można argumentować, że „pierwszy” etap potoku, gdy jest to $match
etap powinien to zrobić, ponieważ w rzeczywistości dokument nie jest zmieniany. Ale teraz tak się nie dzieje.
Wszelkie wartości, które mogą być „stringami” lub przynajmniej niewłaściwym typem BSON, muszą być ręcznie rzutowane w celu dopasowania.