【问题标题】:Update saving partial data更新保存部分数据
【发布时间】:2015-03-02 04:43:41
【问题描述】:
var CandidateProfileSchema = new Schema({
  Skills: {
    programmingLang: [{text: String}],
    scriptingLang:  [{text: String}],
    tools:  [{text: String}],
    ide:  [{text: String}],
  },
  //more fields
});

exports.updateOptPrefs = function(req, res) {
  console.log( req.body );
  if(req.body._id) { delete req.body._id; }
  CandidateProfile.findOne({userId:req.params.id}, function (err, candidateProfile) {
    if (err) { return handleError(res, err); }
    if(!candidateProfile) { return res.send(404); }

    candidateProfile.Skills.programmingLang= req.body.Skills.programmingLang;
    candidateProfile.Skills.scriptingLang= req.body.Skills.scriptingLang;
    candidateProfile.Skills.tools=req.body.Skills.tools;
    candidateProfile.Skills.ide=req.body.Skills.ide;
    //.... other fields
    candidateProfile.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, candidateProfile);
    });
  });
};

不知何故,这只是复制了 mongodb 文档中的 programmingLang 字段。我们在这个问题上花了大约 5 个小时,如果有人能指出我们在这里犯的错误,我们将非常高兴。

【问题讨论】:

    标签: node.js mongodb mongoose mean-stack nosql


    【解决方案1】:

    尝试使用Lo-Dash 扩展:

    var _ = require('lodash');
    exports.updateOptPrefs = function(req, res) {
        if(req.body._id) { delete req.body._id; }
        CandidateProfile.findOne({userId:req.params.id}, function (err, candidateProfile) {
            if (err) { return handleError(res, err); }
            if(!candidateProfile) { return res.send(404); }
            candidateProfile = _.extend(candidateProfile, req.body);
            candidateProfile.save(function (err) {
                if (err) { return handleError(res, err); }
                return res.json(200, candidateProfile);
            });
        });
     };
    

    【讨论】:

    • 或者如果你只想更新技能:candidateProfile.Skills = _.extend(candidateProfile.Skills , req.body.Skills);
    • 我有一个更大的 CandidateProfile 架构 CandidateProfile ({ Skills: {....} other: [{ typeExp:String, organization: String, startDate: String, endDate: String, role: String, description :字符串,成就:字符串}],//更多字段我基本上在调用中更新每个部分,如技能或其他经验。当我在上面的技能部分使用你建议的合并时效果很好。我尝试使用相同的代码对于上面的其他 Exp,我得到了 2 行具有相同数据的行。你能看到问题吗?
    • 你能分享你的路由处理程序代码吗,基本上你可以使用 candidateProfile['propertyName'] = _.extend(candidateProfile['propertyName'] , req.body['propertyName']); 更新架构中的任何属性,并将 propertyName 替换为你想从 req.body 更新的任何内容
    【解决方案2】:

    你为什么不使用 mongoose update 和 $set ?

    CandidateProfile.update( {'userId' : req.params.id}, 
                             {$set : {Skills.programmingLang:req.body.Skills.programmingLang, ...}}, function(err){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多