仅使用mongodb中的save方法更新特定字段

时间:2017-12-26 14:08:03

标签: mongodb

我正在开发一个使用mongodb的快递应用程序。我编写了代码,使用保存方法插入和更新数据,工作正常。

工作代码

dbconnect.collection('profiles').save(data, function (err, result) {
            if (err)
                return res.send({ success: false, message: "Error saving into database" });
            result = JSON.parse(JSON.stringify(result));
            if (_.isEmpty(result) || !result.ok)
                return res.send({ success: false, message: "Unidentified error." })
            return res.send({ success: true });
        });

如果我更新数据,整个文档都会更新。是的,正如它所说。但是我想省略一个字段。

我的字段是

username, password, email, postal_address

如果我没有_id传递,它会创建一个新的_id并插入文档。

如果用户尝试更新postal_address,则会删除密码,因为数据不包含密码字段。它就像重写整个文档一样。

由于代码已编写,我不想将代码分为插入和更新两部分,我正在寻找一种方法,我可以使用保存本身更新部分文档。

希望我明白我的问题。

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你不想使用多个命令进行插入和更新。

您可以使用更新命令,并将upsert选项设置为true。 您可以使用某个查询选择器查找文档,并在更新对象中使用"$set""$setOnInsert"运算符。

"$setOnInsert"可用于在某些自定义逻辑上添加字段,只有在文档被插入并且未更新时才会应用这些字段。

db.collection.update(query, update, {upsert: true})

`db.products.update(
 { name: 'Apple' },
  {
     $set: { item: "apple" },
     $setOnInsert: { defaultQty: 100 }
  },
  { upsert: true }
)`

请参阅此处了解更多信息:MongoDB $setOnInsert

您必须仔细选择查询选择器,因为当您不在查询选择器中提供任何字段时,它将匹配任何文档并将更新该特定文档。因此,最好使用一些可靠的查询选择器,而不是根据您的要求在查询选择器中使用_id,并让upsert自动创建_id(或使用" $ setOnInsert&设置_id #34)

希望这有帮助。