我有一个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
为什么不更新文档。
任何指导将不胜感激。
答案 0 :(得分:1)
尝试使用$addToSet
代替$push
。另外,似乎您应该在_id
而不是id
的更新中进行匹配。