推送到Express

时间:2019-05-21 20:46:18

标签: arrays mongodb express mongoose nosql

我有一个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为什么不更新文档。

任何指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

尝试使用$addToSet代替$push。另外,似乎您应该在_id而不是id的更新中进行匹配。