【问题标题】:Upsert ref documents when pushing to array in Express在 Express 中推送到数组时插入参考文档
【发布时间】: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


    【解决方案1】:

    尝试使用$addToSet 而不是$push。此外,您似乎应该在更新中匹配 _id 而不是 id。

    【讨论】:

    • 返回同样的错误并且不更新数据库。
    • 您的查询中可能有错字。在您的update 中,您是否应该匹配_id 而不是id?
    • 哎呀!而已!现在我觉得自己很笨。
    • 哈哈,通常都是些小事,很高兴能帮上忙!
    猜你喜欢
    • 2016-04-17
    • 2020-03-27
    • 2016-10-12
    • 2018-06-11
    • 2021-09-16
    • 2021-03-27
    • 1970-01-01
    • 2015-06-08
    • 2018-04-12
    相关资源
    最近更新 更多