У меня есть схема Candidate
с массивом ссылок на схему Endorser
. Вот так:
const CandidateSchema = new mongoose.Schema({
name: {
type: String,
required: true,
trim: true
},
endorsements: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Endorser'
}]
});
const EndorserSchema = new mongoose.Schema({
name: {
type: String,
required: true,
trim: true
},
});
Я получаю endorsements
в виде массива строк (то есть имени индоссанта). Я хочу выполнить итерацию по этому массиву и получить _id
каждого из Endorser
модели или добавить новую, если она не существует. Затем я хочу вставить эти ссылки в существующий экземпляр candidate
.
Следующий код работает, но мне действительно неудобно изменять экземпляр candidate
в памяти. Необходимость выполнять разрешение промисов отдельно также кажется странной.
const endorsementPromises = endorsements.map(async endorser => {
let endorserObj = await Endorser.findOneAndUpdate({name: endorser}, {name: endorser}, {upsert: true, new: true});
return endorserObj._id;
});
const endorsementArray = await Promise.all(endorsementPromises);
candidate.endorsements = candidate.endorsements.concat(endorsementArray);
await candidate.save();
Я пробовал использовать findOneAndUpdate
с $push
и $each
. Однако это только возвращает ошибку и не обновляет документ.
Candidate.update(
{id: candidate._id},
{$push: {
endorsements: {
$each: endorsementArray
}
}}
);
// the error
Error: {"n":0,"nModified":0,"ok":1}
Я не уверен, почему $push
и $each
не обновляют документ.
Любое руководство будет действительно оценено.
Попробуйте использовать $addToSet
вместо $push
. Кроме того, кажется, что вы должны сопоставлять _id
вместо id
в своем обновлении.
Похоже, у вас может быть опечатка в вашем запросе. В вашем update
вы должны сопоставлять _id
вместо id
?
Упс! Вот и все! Теперь я чувствую себя немым.
Ха-ха, обычно это что-то маленькое, рад, что смог помочь!
Возвращает ту же ошибку и не обновляет базу данных.