[英]I want to add data in mongo collection while updating, but instead its getting updated
我想在更新時添加數據,所以用例是在我進行 for 循環將數據存儲到數據庫中時將數據添加到同一個 object 中。 但是當我嘗試這樣做時,它會得到更新,而不是添加到當前存在的 object 中。
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;
}
}
在上面的 function 中,我正在嘗試將數據添加到 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"
}
}
可以說上面是集合中可用的數據。
現在我是一個 for 循環,我正在使用相同數據的 id 更新數據。
await update_records(_id, fileName, row);
在上面的代碼中, row
是包含過濾器的循環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"
}
}
這也是我的 model 的樣子
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},
我怎樣才能做到這一點?
編輯:制作 Model 過濾器陣列
const result = await execute_reports_model.findByIdAndUpdate(
_id,
{
$set:
{
filters: [filters_data],
}
});
上面的代碼正在更新文件而不是插入另一個文件。 我只想添加新的,而不是更新現有的。
我看到您正在嘗試將新過濾器 object 添加到filters
字段,但filters
字段是 object 所以它總是被替換。 要在過濾器中添加新過濾filters
,您必須制作filters
數組,然后只需 append 它。
首先,您的 model 描述了錯誤的含義。 您的過濾器應該是一個數組。
如果您想用逗號存儲多個 object,您應該為過濾器設置數組數據類型。
為需要存儲在過濾器數組中的 object 制作其他 model。
讓我們稱之為filterModel 。
然后您的主要 model 應該如下所示:
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}
編輯:
您好,您應該使用 push 操作在數組中添加條目而不是替換現有值,而不是使用 set 操作。 所以請嘗試下面的代碼行。
const result = await execute_reports_model.findByIdAndUpdate(
_id,
{
$push:
{
filters: filters_data,
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.