提问者:小点点

我想在更新时在mongo集合中添加数据,但是它正在更新


我想在更新时添加数据,所以用例是在创建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],
                }
            });

上面的代码正在更新文件,而不是插入另一个文件。 我只想添加新的,而不是更新现有的。


共2个答案

匿名用户

我看到您正在尝试向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}