在 Express 中推送到数组时插入参考文档

Posted

技术标签:

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

非常感谢任何指导。

【问题讨论】:

【参考方案1】:

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

【讨论】:

返回同样的错误并且不更新数据库。 您的查询中可能有错字。在您的update 中,您是否应该匹配_id 而不是id 哎呀!而已!现在我觉得自己很笨。 哈哈,通常都是些小事,很高兴能帮上忙!

以上是关于在 Express 中推送到数组时插入参考文档的主要内容,如果未能解决你的问题,请参考以下文章

从 Vue.js 2 中的计算属性中推送到数组

如何在 Angular 4 中推送到数组的 Observable? RxJS

TableView 在 Swift 中推送到详细视图

如何在 React Router v5 中推送到历史记录?

如何在 React Router v5 中推送到历史记录?

我可以在 git 的一个命令中推送到多个存储库吗?