MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Moongoose aggregate $match non corrisponde agli ID

I tuoi ids la variabile sarà composta da "stringhe" e non da ObjectId valori.

Mongoose "trasmette automaticamente" i valori di stringa per ObjectId nel tipo corretto nelle query regolari, ma ciò non accade nella pipeline di aggregazione, come descritto nel numero 1399.

Invece devi eseguire il casting corretto per digitare manualmente:

ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })

Quindi puoi usarli nella tua fase di pipeline:

{ "$match": { "_id": { "$in": ids } } }

Il motivo è perché le pipeline di aggregazione "tipicamente" alterano la struttura del documento, e quindi Mongoose non presume che lo "schema" si applichi al documento in una determinata fase della pipeline.

È discutibile che la "prima" fase della pipeline quando è un $match fase dovrebbe farlo, poiché in effetti il ​​documento non viene alterato. Ma in questo momento non è così che succede.

Tutti i valori che potrebbero essere "stringhe" o almeno non il tipo BSON corretto devono essere trasmessi manualmente per poter corrispondere.