簡體   English   中英

我想在更新時在 mongo 集合中添加數據,但它正在更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM