Temukan objek subdokumen di db lain
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
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
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);