Mogoose:在更新文档之前检查架构中是否存在字段

时间:2019-08-05 09:12:41

标签: node.js mongodb mongoose

我有一个这样的收集模型:

const Task = mongoose.model('Task', {
  description: {
    type: String,
    trim: true,
    required: true
  },
  completed: {
    type: Boolean,
    default: false
  }
})

当前,当用户尝试使用API​​更新文档时,架构中未包含的任何字段都将被忽略,并且文档将被更新。如果用户使用数据库中不可用的字段向API发送更新请求,我想抛出一个错误。

如果我在数据库中有一个ID为12345的任务:

{
  _id: 12345,
  description: "Buy cheese."
  completed: false
}

并且用户向该任务的API发送更新查询:

id = '12345'
updates = {
  description: 'Buy Milk',
  due: '1 Week' //<-- Invalid Field
}

我使用此对象来更新文档:

await Task.findByIdAndUpdate(id, updates)

猫鼬完全忽略无效的due字段,并使用新的description字段更新文档。

有没有一种干净的方法来避免这种无效的更新请求?

2 个答案:

答案 0 :(得分:1)

我发现一种方法是:

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
csr = conn.cursor()
interconnectmo1 = csr.execute("""exec TNT.dbo.abc \
    @start_date = "%(mo1_start_date)s" -- datetime \
  , @end_date =  "%(mo1_end_date)s"   -- datetime \
  , @syscode = NULL           -- varchar(8000)  \
  , @estimate_ids = NULL       -- varchar(8000)""" % (params1))

csr.execute(interconnectmo1, (params1))

答案 1 :(得分:0)

While updating add in criteria the key that comes from the front end with $exists if it's not found in database update will not return any data and you can throw an error in that case.

criteria will be {_id:id};
update will be {description: 'Buy Milk'};
if(payload.due){
   criteria.due:{$exists:true},
   update.due=payload.due
}

让updatedData =等待Task.update(条件,更新)    if(updatedData.n == 0)抛出错误传递了无效参数

// https://docs.mongodb.com/manual/reference/method/db.collection.update/  而且只使用一个查询