Cómo adaptar la consulta MongoDB del formato del controlador Node.js al formato Mongoose
Aug 17 2020
Agradecería un poco de ayuda con la sintaxis de una consulta con Mongoose.
Tengo esta consulta que se ejecuta bien con el controlador MongoDB Node.js para eliminar un ObjectId de una matriz anidada de ID de objeto:
let filter = { _id : new ObjectId('5f30b40839aab119f4b3e21d'), 'groups._id': new ObjectId('5f3a23ec3680923d04ff970c') };
let update = { $pull: { "groups.$.students": new ObjectId('5f1a57a9d433f86ec0750c2c') }};
client.db('database').collection('collection').findOneAndUpdate(filter, update, function(err, res) {
if (err) console.log(err);
console.log(JSON.stringify(res, null, 2));
client.close();
});
Cuando intento ejecutar la consulta usando Mongoose Schema, la consulta no elimina el ObjectId de la matriz, pero no arroja ningún error:
let groupFilter = { _id: existingClassroom._id, 'groups._id': groupId };
let groupUpdate = { $pull: { "groups.$.students": existingUser._id } };
await Classroom.findOneAndUpdate(groupFilter, groupUpdate, {new: true}, async (err, doc) => {
if(err){
console.log(err);
}
});
El esquema de Mongoose tiene el esquema para estos campos definidos así:
groups:[
{
students:[
mongoose.Schema.Types.ObjectId
],
dateCreated: {
type: Date,
default: Date.now
}
}
]
Respuestas
1 turivishal Aug 17 2020 at 16:19
Puede convertir la identificación de la cadena en la identificación del objeto usando mongoose.Types.ObjectId
,
let groupFilter = {
_id: mongoose.Types.ObjectId(existingClassroom._id),
'groups._id': mongoose.Types.ObjectId(groupId)
};
let groupUpdate = {
$pull: { "groups.$.students": mongoose.Types.ObjectId(existingUser._id)
}
};
await Classroom.findOneAndUpdate(groupFilter, groupUpdate, { new: true },
async (err, doc) => { if (err) { console.log(err); } }
);