【问题标题】:Update specific fields only using save method in mongodb仅在 mongodb 中使用 save 方法更新特定字段
【发布时间】:2017-12-26 14:08:02
【问题描述】:

我正在开发一个使用 mongodb 的 express 应用程序。我编写了代码以使用运行良好的保存方法插入和更新数据。

工作代码

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 并插入文档。

如果用户尝试更新邮政地址,它会删除密码,因为数据不包含密码字段。这就像重写整个文档。

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

希望我把我的问题说清楚了。

【问题讨论】:

  • 您也可以将updateupsert 选项一起使用,所以它仍然只是一步。
  • 解释了here
  • 我终于拆分了我的代码。感谢您的时间和更新

标签: mongodb


【解决方案1】:

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

您可以使用将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

希望这会有所帮助。

【讨论】:

  • 不幸的是,我有 _id 作为参考。我不想改变它。所以我不能让你提到锻炼。感谢您的时间和更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2022-01-20
相关资源
最近更新 更多