MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O $match agregado da Moongoose não corresponde aos id's


Seus ids variável será construída de "strings", e não ObjectId valores.

Valores de string "autocasts" do Mongoose para ObjectId em seu tipo correto em consultas regulares, mas isso não acontece no pipeline de agregação, conforme descrito no problema #1399.

Em vez disso, você deve fazer a conversão correta para digitar manualmente:
ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })

Então você pode usá-los em seu estágio de pipeline:
{ "$match": { "_id": { "$in": ids } } }

A razão é porque os pipelines de agregação "normalmente" alteram a estrutura do documento e, portanto, o mangusto não assume que o "esquema" se aplica ao documento em qualquer estágio do pipeline.

É discutível que o "primeiro" estágio do pipeline quando é um $match estágio deve fazer isso, pois de fato o documento não é alterado. Mas agora não é assim que acontece.

Quaisquer valores que possam ser "strings" ou pelo menos não o tipo BSON correto precisam ser convertidos manualmente para corresponder.