Rechercher un objet de sous-document dans une autre base de données

Aug 15 2020

J'essaie de vérifier chaque e-mail des participants et de voir s'ils sont un utilisateur enregistré. Sinon, je leur enverrai un mail (pas encore codé, je le ferai plus tard).

Voici l'événement et le schéma utilisateur:

const UserSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    date: {
        type: Date,
        default: Date.now
    }
});
     
const Event = new Schema({
    title: {
        type: String,
        required: true
    },
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'users'
    },
    attendees:[
     {email: {
        type: String,
        required: true
     },
     name: {
        type: String,
        required: true
     },
     status: {
     type: String
     }}
   ]
}); 

router.post('/', auth, async (req, res) => {
  const {title,
    attendees
  } = req.body

  if (!title) {
    return res.status(400).json({ msg: 'Please enter a title' });
  }

  try{  
    const newEvent = new Event({
        title,
        user: req.user.id,
        attendees:  attendees.map(x => ({
          email: x.email,
          name: x.name,
          status: x.status,
        })),
    });

const attendeeExists = await User.findOne({"attendees.email":email});
if (!attendeeExists) throw Error("User doesn't exist. Send email");

Les deux dernières lignes me donnent une erreur: l'email n'est pas défini. Je ne sais pas ce que je manque.

Cela fonctionne dans les routes utilisateur:

const user = await User.findOne({ email });

Réponses

morethan1 Aug 18 2020 at 15:09

Merci @ambianBeing, votre solution m'a aidé à obtenir un modèle fonctionnel.

const email = attendees.map((a) => a.email);
const attendeesFound = await User.find({email});
ambianBeing Aug 17 2020 at 22:15

Pour vérifier l'un des e-mails trouvés du participant, .find()avec $inpeut être utilisé pour renvoyer les utilisateurs trouvés avec l'un des identifiants de messagerie.

/*collect all emails to test*/
const emails = attendees.map((a) => a.email);
const attendeesFound = await User.find({ "email": { $in: emails } });

Une autre syntaxe Mongoose qui fait la même chose que ci-dessus:

/*collect all emails to test*/
const emails = attendees.map((a) => a.email);
const attendeesFound = await User.find({}).where("email").in(emails);