あなたのids
変数は、ObjectId
ではなく、「文字列」で構成されます。 値。
ObjectId
のマングースの「自動キャスト」文字列値 通常のクエリでは正しいタイプに変換されますが、問題#1399で説明されているように、これは集約パイプラインでは発生しません。
代わりに、手動で入力するには正しいキャストを行う必要があります:
ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })
その後、パイプラインステージでそれらを使用できます:
{ "$match": { "_id": { "$in": ids } } }
その理由は、集約パイプラインが「通常」ドキュメント構造を変更するためです。したがって、マングースは、「スキーマ」が特定のパイプラインステージのドキュメントに適用されるとは想定していません。
$match
の場合の「最初の」パイプラインステージは議論の余地があります 実際にドキュメントは変更されていないため、ステージはこれを行う必要があります。しかし、今のところ、これはそれがどのように起こるかではありません。
「文字列」である可能性がある値、または少なくとも正しいBSONタイプではない可能性のある値は、一致させるために手動でキャストする必要があります。