Comment adapter la requête MongoDB du format de pilote Node.js au format Mongoose
J'apprécierais de l'aide avec la syntaxe d'une requête utilisant Mongoose.
J'ai cette requête qui fonctionne bien en utilisant le pilote MongoDB Node.js pour supprimer un ObjectId d'un tableau imbriqué d'ID d'objets:
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();
});
Lorsque j'essaie d'exécuter la requête à l'aide de Mongoose Schema, la requête ne supprime pas l'ObjectId du tableau, mais elle ne génère aucune erreur:
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);
}
});
Le schéma Mongoose a le schéma pour ces champs définis comme ceci:
groups:[
{
students:[
mongoose.Schema.Types.ObjectId
],
dateCreated: {
type: Date,
default: Date.now
}
}
]
Réponses
1 turivishal
Vous pouvez convertir l'identifiant de chaîne en identifiant d'objet en utilisant 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); } }
);