Temukan objek subdokumen di db lain

Aug 15 2020

Saya mencoba memeriksa setiap email peserta dan melihat apakah mereka adalah pengguna terdaftar. Jika tidak, saya akan mengirim mereka email (belum diberi kode, akan dilakukan nanti).

Berikut event dan skema pengguna:

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");

Dua baris terakhir memberi saya kesalahan: email tidak ditentukan. Tidak yakin apa yang saya lewatkan.

Ini berfungsi di rute pengguna:

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

Jawaban

morethan1 Aug 18 2020 at 15:09

Terima kasih @ambianBeing, solusi Anda membantu saya mendapatkan model yang berfungsi.

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

Untuk memeriksa email peserta mana pun yang ditemukan, .find()dengan $indapat digunakan yang akan mengembalikan pengguna yang ditemukan dengan salah satu id email.

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

Sintaks Mongoose lain yang melakukan hal yang sama seperti di atas:

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