Вашите ids
променливата ще бъде съставена от "низове", а не от ObjectId
стойности.
Mongoose „автоматично предава“ стойности на низове за ObjectId
в правилния им тип в редовните заявки, но това не се случва в конвейера за агрегиране, както е описано в брой #1399.
Вместо това трябва да направите правилното прехвърляне, за да въведете ръчно:
ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })
След това можете да ги използвате във вашия етап на тръбопровода:
{ "$match": { "_id": { "$in": ids } } }
Причината е, че конвейерите за агрегиране "обикновено" променят структурата на документа и следователно mongoose не предполага, че "схемата" се прилага към документа във всеки даден етап на конвейера.
Може да се спори, че "първият" етап на конвейера, когато е $match
етап трябва да направи това, тъй като наистина документът не се променя. Но точно сега не става така.
Всички стойности, които може да са „низове“ или поне не от правилния тип BSON, трябва да бъдат прехвърлени ръчно, за да съвпадат.