【发布时间】:2019-10-08 07:26:29
【问题描述】:
我有一个 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(即背书人的姓名)。我想遍历该数组并从Endorser 模型中检索每个数组的_id,或者如果它不存在则插入一个新的。然后我想将这些引用推送到现有的 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 不更新文档。
非常感谢任何指导。
【问题讨论】:
标签: arrays mongodb express mongoose nosql