我想在更新时添加数据,所以用例是在创建for循环将数据存储到数据库时将数据添加到相同的对象中。 但是当我尝试这样做的时候,它会更新,而不是添加到当前对象中。
const update_records = async (_id, fileName, filter) => {
try {
await connect_to_mongo();
const result = await execute_reports_model.findOneAndUpdate(_id, {upsert: true}, function (err, doc){
if(err || doc === null){
console.error(err);
const e = new Error('ID not found.');
e.status = 404;
throw e;
}
doc.file_name = fileName;
doc.filters.id = filter._id
doc.filters.name = filter.name
doc.filters.origin = filter.origin
doc.save();
})
return result;
} catch (error) {
console.error(error);
throw error;
}
}
在上面的函数中,我试图将数据添加到mongo集合中的现有数据中。(使用mongoose)
{
"_id" : ObjectId("5f16f4e1291796bb531a06df"),
"student)_count" : 5,
"batch_key" : "ddddwe3-6e4a-4654-8f18-c44b152c52c3",
"report_id" : "5f0ffbcdd264d70c1a3b143aa",
"__v" : 0,
"file_name" : "Student Copy Demand file",
"filters" : {
"id" : "5f0ffb96d67d70c1a3b143e7",
"name" : "USER 2 cards filter",
"origin" : "USER"
}
}
假设上面的数据是集合中可用的数据。
现在我一个用于循环,我正在用相同数据的id更新数据。
await update_records(_id, fileName, row);
在上面的代码中,行
用于循环行
,其中包含过滤器,过滤器需要在现有记录中添加文件名,我将通过该_id
查找
行包含以下数据的示例
{
"id" : "2f0f3fb496d670c513iuroinm",
"name" : "Student Daily attendence",
"origin" : "Student"
}
则更新后的记录将如下所示:
{
"_id" : ObjectId("5f16f4e1291796bb531a06df"),
"student)_count" : 5,
"batch_key" : "ddddwe3-6e4a-4654-8f18-c44b152c52c3",
"report_id" : "5f0ffbcdd264d70c1a3b143aa",
"__v" : 0,
"file_name" : "Student Copy Demand file",
"filters" : {
"id" : "5f0ffb96d67d70c1a3b143e7",
"name" : "USER 2 cards filter",
"origin" : "USER"
},
{
"id" : "2f0f3fb496d670c513iuroinm",
"name" : "Student Daily attendence",
"origin" : "Student"
}
}
这也是我的模型的样子
report_id:{type:String,trim:true},
file_name:{type:String},
filters:[{
status:{type:String}, // this would updated in another function
id:{type:String},
name:{type:String},
origin:{type:String}
}],
batch_key:{type:String,trim:true},
我怎样才能做到这一点呢?
编辑:制作模型过滤器数组
const result = await execute_reports_model.findByIdAndUpdate(
_id,
{
$set:
{
filters: [filters_data],
}
});
上面的代码正在更新文件,而不是插入另一个文件。 我只想添加新的,而不是更新现有的。
我看到您正在尝试向filters
字段添加新的筛选器对象,但filters
字段是对象,因此它总是被替换。 若要在filters
中添加新的筛选器,必须创建filters
数组,然后将其追加。
首先,你的模型描述了错误的含义。 筛选器应该是一个数组。
如果希望使用逗号存储多个对象,则筛选器应该使用数组数据类型。
为需要存储在筛选器数组中的对象创建其他模型。
我们称之为FilterModel。
那么你的主模型应该是这样的:
report_id:{type:String,trim:true},
file_name:{type:String},
filters: filterModel[]=[]
batch_key:{type:String,trim:true},
您的filterModel应该具有以下内容:
status:{type:String}, // this would updated in another function
id:{type:String},
name:{type:String},
origin:{type:String}