使用$ addToSet和$ each插入mongoose重复项以将项目推送到数组中

时间:2017-09-29 06:40:03

标签: node.js mongodb mongoose

我正在尝试将一组对象推送到文档中。我使用$ addToSet尝试不插入重复数据。我想检查一下applied.studentId。但是如果我两次传递相同的请求,那么数据就会被插入。是否有我必须使用的$ addToSet和$的检查?

我的架构如下

 jobId: { type: Number},
 hiringCompanyId: String,
 applied: [{
        studentId: String,
        firstName:String,
        lastName:String,
        gender:String,
        identityType:String,
        identityValue:String,
        email:String,
        phone:String,
    }],

我的节点代码如下。

public ApplyForJob(data: JobDto): Promise<{ status: string }> {

    let students = data.applied;


    let findQuery = {hiringCompanyId: data.hiringCompanyId, jobId: data.companyJobId};
    let appliedQuery = {};
    if (!isNullOrUndefined(data.applied.length)) {
        appliedQuery = {
            "$addToSet": {
                "applied": {
                    "$each": data.applied
                }
            }
        };
    }

    return new Promise((resolve, reject) => {
        Jobs.findOneAndUpdate(findQuery, appliedQuery).exec((err, info) => {
            if (err) {
                reject(new UpdateError('Jobs - Update()', err, Jobs.collection.collectionName));
            } else {
                console.log(info);
                resolve({status: "Success"});
            }
        })
    });

}

2 个答案:

答案 0 :(得分:1)

在禁用日期字段时,$ addToSet不会添加重复值。根据文档https://docs.mongodb.com/manual/reference/operator/update/addToSet/

因此,字段顺序很重要,您无法指定MongoDB仅比较文档中字段的子集来确定文档是否与现有数组元素重复。

答案 1 :(得分:0)

正如Rahul Ganguly提到的那样,我们无法使用JS对象可靠地使用$ addToSet。

一个选项是将应用移到单独的集合中,并使Job模式引用为新的应用模型。

示例:

{
  jobId: { type: Number },
  hiringCompanyId: String,
  applied: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Applied'
  }]
}