Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose使用$addToSet和$each将重复项插入数组中_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js mongoose使用$addToSet和$each将重复项插入数组中

Node.js mongoose使用$addToSet和$each将重复项插入数组中,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图将一组对象推送到文档中。我正在使用$addToSet尝试不插入重复数据。我想检查一下applied.studentId。但是如果我两次传递相同的请求,那么数据就会被插入。我是否必须使用$addToSet和$each的支票 我的模式如下 jobId: { type: Number}, hiringCompanyId: String, applied: [{ studentId: String, firstName:String, last

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

我的模式如下

 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"});
            }
        })
    });

}

禁用日期字段时,$addToSet不会添加重复的值。根据文件


因此,字段顺序很重要,您不能指定MongoDB只比较文档中字段的子集来确定文档是否是现有数组元素的副本。

正如Rahul Ganguly绝对正确地提到的,我们无法可靠地将$addToSet用于JS对象

一个选项是将应用程序移入单独的集合,并使作业模式引用新的应用程序模型

例如:

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

我甚至在schemaOK中设置了_id:false,因此禁用日期字段$addToSet是有效的。在执行addToSet检查时是否有禁用字段的选项?mongoose 4.11.11和Mongo3.4.2