Nodejs findOneAndUpdate参数

时间:2018-03-03 13:37:59

标签: node.js mongoose

我有一个具有以下架构的用户模型,所有必填字段

name:String, 
country:String,
age:Number

从前端我按更新按钮并仅更新年龄字段,在后端我有以下

var body = _.pick(req.body, ["candidateId","name","age","country"]);
var candidateId = mongoose.Types.ObjectId(body.candidateId);

Candidate.findOneAndUpdate({
        _id:candidateId
    },{
        name: body.name,
        country: body.country,
        age: body.age,
    }).then((data) => {
        if (!data) {
            res.status(400).send('noDataFound');
        } else {
            res.status(200).send(data);
        }
    }).catch((e) => {
        res.status(500).send(e)
    })

Front传递数据如下

{   "candidateId":"5a9a86c16acff45a8070d2da",
     "name":"Superman",
}

我将得到body.age和body.country的未定义错误,因为它没有从前端传递。

问题 - 如果某些参数没有从前端发送任何值,如何使用之前的值,一种方法是发送所有内容,即使它没有更改。

4 个答案:

答案 0 :(得分:1)

看起来您正在使用lodash,请查看omitBy以删除未定义或空属性:

_.omitBy({ foo: 'foo', bar: undefined, baz: null }, _.isNil)
{foo: "foo"}

这是一个普通的JS解决方案:

Object
  .entries({ foo: 'foo', bar: undefined, baz: null })
  .filter(([_, value]) => value !== null && value !== undefined)
  .reduce((acc, [key, value]) => { acc[key] = value; return acc; }, {})

答案 1 :(得分:0)

形成一个包含已发送值的新对象:

const newObj = {};

if (body.name) {
  newObj.name = body.name;
}

if (body.age) {
  newObj.age = body.age;
}

if (body.country) {
  newObj.country = body.country;
}

然后使用newObj进行更新。

Candidate.findOneAndUpdate({
        _id:candidateId
    }, newObj)...

答案 2 :(得分:0)

当我遇到这个问题时,我通常会创建一个解析器函数:

var body = _.pick(req.body, ["candidateId","name","age","country"]);
var candidateId = mongoose.Types.ObjectId(body.candidateId);

function createUpdatedValues(params) {
  var condition = {};
  if (params.candidateId) condition.candidateId = params.candidateId;
  if (params.name) condition.name = params.name;
  if (params.age) condition.age = params.age;
  if (params.country) condition.country = params.country;
  return condition;
}    

Candidate.findOneAndUpdate({
        _id:candidateId
    },createUpdatedValues(body)).then((data) => {
        if (!data) {
            res.status(400).send('noDataFound');
        } else {
            res.status(200).send(data);
        }
    }).catch((e) => {
        res.status(500).send(e)
    })

答案 3 :(得分:0)

我正在使用以下方式来解决它,如果有任何其他更好的方法,让我知道作为答案的不良标记。

我现在传递所有数据以从像这样的新对象的前端更新

---客户数据---

{   "candidateId":"5a9a86c16acff45a8070d2da",
    "updatedData":{
        "firstName":"Jack",
        "lastName":"Bauer",
        "applicationSource":"consultant",
        "skills":["trading","sales"]    
    }
}

----更新逻辑----

var body = _.pick(req.body, ["candidateId","updatedData"]);
    var candidateId = mongoose.Types.ObjectId(body.candidateId);

    var dataToUpdate = _.pick(body.updatedData,["firstName","lastName"]);

    Candidate.findOneAndUpdate({
        _id:candidateId
    },dataToUpdate).then((data) => {
        if (!data) {
            res.status(400).send('noDataFound');
        } else {
            res.status(200).send(data);
        }
    }).catch((e) => {
        res.status(500).send(e)
    })