J'ai des difficultés à ajouter un autre champ à tous les enregistrements de la base de données user
avec une valeur de chaque document. J'ai l'habitude d'utiliser $set
con db.model.updateMany
y $addFields
avec le pipeline d'agrégation, j'ai utilisé les deux pour résoudre des problèmes dans le passé, dans ce cas, je dois effectuer quelques logiques/calculs avant d'ajouter la valeur, et c'est là que se situe mon problème.
Disons que j'ai le schéma suivant :
{
"users": [
{
"wallets": {...},
"avatar": "",
"isVerified": false,
"suspended": false,
"country": "Nigeria",
"_id": "123",
"resetPasswordToken": "",
"email": "example@gmail.com",
"phone": "08012398743",
"name": "Agbakwuru Nnaemeka Kennedy ",
"role": "user",
},
{...}
}
Je souhaite ajouter un nouveau champ phoneNumber
qui prendra la valeur du champ existant phone
mais avant de l'ajouter, j'aimerais effectuer une analyse logique, car certaines des valeurs du téléphone ont des espaces, la plupart d'entre elles ne sont pas correctement formatées, et j'aimerais ajouter le code du pays à l'adresse phone
avant de l'ajouter à la nouvelle valeur phoneNumber
champ.
J'ai pu le faire en utilisant un curseur de Mongoose db.mode.aggregate
méthode, avec $match
et en ajoutant le champ à chaque document avec l'agrégat $addFields
pipeline, cela s'est avéré prendre beaucoup de temps, j'ai dû arrêter l'opération car elle prenait trop de temps à fonctionner.
J'aimerais croire qu'il existe une meilleure solution. Je vous remercie de votre aide.
Edita:
Voici l'agrégation que j'utilise :
const userCursor = User.aggregate([{$match: {phone: {$exists: true}}}]);
for await (const doc of userCursor) {
await User.findByIdAndUpdate(doc._id, {$set: {
phoneNumber: convertPhoneNumber({phoneNumber: doc.phone.replace(/\s+/g, "")})}
});
}
En convertPhoneNumber
est une méthode d'aide que j'ai définie dans mes utilitaires pour ajouter le code du pays au numéro de téléphone.