首页 > 解决方案 > 尝试更新 mongo 数据中的数组

问题描述

我正在尝试更新/添加数据收集记录数组中的字段。

    { _id: 5f172788d775fa49dc0abe63,
      filter_count: 5,
      batch_key: '187aa0b2-f8b7-4b6a-8bd3-4d2df288e673',
      report_id: '5f0ffbcdd67d70c1a3b143aa',
      filters:
       [ { _id: 5f17278bd775fa49dc0abe64,
           name: 'USER 2 cards filter',
           id: '5f0ffb96d67d70c1a3b143e7',
           origin: 'USER' },
         { _id: 32334355fa49dc0abe545645,
           name: 'USER 1 cards filter',
           id: 'drdeseadasda3b143e34sad',
           origin: 'STUDENT' } ],
      __v: 0,
      file_count: 1 }

以上是我拥有的数据,现在我试图在过滤器中添加一个字段,数组匹配id 但它没有发生在下面的代码中。

   const result = await execute_model.findByIdAndUpdate(
                _id, 
                { "filters.id" : id{
                    $set:
                    {
                        status: 'SUCCESS'
                        info: 'SUCCESSFULLY CREATED'
                    }
                }
                }, {new: true});

_id将会5f172788d775fa49dc0abe63

id将是(将在过滤器数组中5f17278bd775fa49dc0abe64

因此,例如,当我通过上述内容时_idid预期的结果如下

 { _id: 5f172788d775fa49dc0abe63,
      filter_count: 5,
      batch_key: '187aa0b2-f8b7-4b6a-8bd3-4d2df288e673',
      report_id: '5f0ffbcdd67d70c1a3b143aa',
      filters:
       [ { _id: 5f17278bd775fa49dc0abe64,
           name: 'USER 2 cards filter',
           id: '5f0ffb96d67d70c1a3b143e7',
           origin: 'USER',
           status: 'SUCCESS',
           info: 'SUCCESSFULLY CREATED'
         },
         { _id: 32334355fa49dc0abe545645,
           name: 'USER 1 cards filter',
           id: 'drdeseadasda3b143e34sad',
           origin: 'STUDENT' } ],
      __v: 0,
      file_count: 1 }

不知道为什么它没有发生,任何人都可以在这里帮助我。设置正确的查询?

编辑模型

 report_id:{type:String,trim:true},
    file_name:{type:String},
    filters:[{
        status:{type:String}, // Trying to add this
            id:{type:String},
          info:{type:String}, // Also this
          name:{type:String},
        origin:{type:String}
     }],

batch_key:{type:String,trim:true},
file_count:{type:Number},
filter_count:{type:Number},
 executed_time:{type:Date}

标签: javascriptnode.jsmongodbmongoose

解决方案


您需要检查execute_model以查看该模型是否具有字段statusinfo否则它不会更新。例子。

const execute_model = new Schema(
    {
        filter_count: Number,
        batch_key: String,
        report_id: String,
        filters:[{name:String, status: 'String', info:'String', origin:'String' }]
}

因此,您需要 Schema 中的字段,否则它将被忽略。

一种选择是你找到一个

const data = await execute_model.find({ _id }).limit(1);

现在你有了全部数据。现在使用 javascript 数组方法更新数据并一次性更新 mongo。

const newData = await execute_model.findOneAndUpdate(
                    { _id: data[0].id },
                    { filter_count: 5,
      batch_key: '187aa0b2-f8b7-4b6a-8bd3-4d2df288e673',
      report_id: '5f0ffbcdd67d70c1a3b143aa',
      filters:
       [ { _id: 5f17278bd775fa49dc0abe64,
           name: 'USER 2 cards filter',
           id: '5f0ffb96d67d70c1a3b143e7',
           origin: 'USER',
           status: 'SUCCESS',
           info: 'SUCCESSFULLY CREATED'
         },
         { _id: 32334355fa49dc0abe545645,
           name: 'USER 1 cards filter',
           id: 'drdeseadasda3b143e34sad',
           origin: 'STUDENT' } ],
      __v: 0,
      file_count: 1 }
                )

推荐阅读