MongoDB,如果新值不为null,则更新集合字段

时间:2014-02-27 14:28:20

标签: javascript node.js mongodb

仅当新值不为null时,我才会更新设置值的集合。 我有这样的代码:

 ...
 var userName = req.body.nome;
 var userSurname = req.body.cognome;
 var userAddress = req.body.indirizzo;

 collection.update(
     {_id:ObjectId(req.session.userID)},
     {$set: { nome: userName, cognome: userSurname, indirizzo: userAddress }}
 )

这样做有简单的方法吗?

另一种方式: 如果我可以从我获取数据的表单的占位符中取值req.body.*,我可以解决问题..但这可能吗?

8 个答案:

答案 0 :(得分:13)

您可以尝试这样的事情:

var objForUpdate = {};

if (req.body.nome) objForUpdate.nome = req.body.nome;
if (req.body.cognome) objForUpdate.cognome = req.body.cognome;
if (req.body.indirizzo) objForUpdate.indirizzo = req.body.indirizzo;

//before edit- There is no need for creating a new variable
//var setObj = { $set: objForUpdate }

objForUpdate = { $set: objForUpdate }

collection.update({_id:ObjectId(req.session.userID)}, objForUpdate })

答案 1 :(得分:1)

您可以通过将req.body投射到模型

来使用mongoose

我假设你有一个名为User的猫鼬模型,并且在你的控制器中,

var userModel = new User(req.body);
User.update({_id: req.session.userID}, userModel, {upsert: true}, function(err){
   console.log("Error occured!");
});

没有猫鼬标签,但我强烈建议使用它。有关详细信息;

Mongoose Update

Mongoose Model

答案 2 :(得分:1)

您是否只是要求传递您发布的所有字段?为什么不这样做呢?

(基本上只是代码的剪切和粘贴):

collection.update(
    {_id: ObjectId(req.session.userID)},
    {$set: req.body }
)

然后,在您的更新中设置您作为字段发布的任何内容。

请注意,使用set只会 覆盖,或添加新字段。如果您只想替换整个文档,则删除整个{$set: (..) }表示法,然后传入req正文,因为它是一个valild对象。

答案 3 :(得分:0)

Hüseyin BABAL的回答是正确的,但是会从mongo生成警告,因为调用new User()会创建一个不可变的新_id。你想要做的是以下几点:

const userModel = Object.assign(req.body);
User.update({_id: req.session.userID}, userModel, {upsert: true}, 
  function(err){
    console.log("Error occured!");
  });

答案 4 :(得分:0)

您可以像其他问题一样使用lodash:https://stackoverflow.com/a/33432857/4777292

_.pickBy({ a: null, b: 1, c: undefined }, _.identity);

将会

{b:1}

答案 5 :(得分:0)

如果没有您不希望用户更改的任何字段。因为此方法将采用任何不为空的值并对其进行更新。您可以这样做。

 const updatedFields = {};
 Object.keys(req.body).forEach(key => {
   if (!isEmpty(req.body[key])) {
     updatedFields[key] = req.body[key];
   }
 });
YourModel.findOneAndUpdate(
      { employee_id: req.body.employee_id },
      {$set:updatedFields},
      {new:true}).then(updatedObj =>{
        console.log("updated obj:",updatedObj);
      })

是空函数

    const isEmpty = value =>
  value === undefined ||
  value === null ||
  (typeof value === "object" && Object.keys(value).length === 0) ||
  (typeof value === "string" && value.trim().length === 0);

答案 6 :(得分:0)

此版本仍允许尊重和更新空字符串字段。忽略的字段将被忽略。

const cleanedObject = Object.keys(origObject).reduce((acc, k) => {
  if (typeof origObject[k] === "undefined") return acc;
  acc[k] = origObject[k];
  return acc;
}, {});

collection.update({_id:ObjectId(req.session.userID)}, cleanedObject })

答案 7 :(得分:0)

可能您已经通过了用户身份验证,因此您应该具有req.user。*

在这种情况下,您可以使用三元运算符来分配值,并使用新值或当前值对其进行更新(因此没有更新)

var userName = req.body.nome ? req.body.nome : req.user.nome;
var userSurname = req.body.cognome ? req.body.nome : req.user.cognome;
var userAddress = req.body.indirizzo ? req.body.indirizzo : req.user.indirizzo;

collection.update(
     {_id:ObjectID(req.session.userID)},
     {$set: { nome: userName, cognome: userSurname, indirizzo: userAddress }}
)

如果没有req.user,则可以分3个步骤进行操作。 1.在集合中查找用户 2.获取当前数据 3.使用新的或当前的(如上所述)更新数据

let currentName
let currentSurname
db. collection.findOne({_id: ObjectID(req.session.userID)}, (err, user) => {
    if (err) { } // handle error here
    else if (user) {
        currentName = user.name
        currentSurname = user.surname
    }
})