【问题标题】:How to override whole json document in mongodb update call如何在 mongodb 更新调用中覆盖整个 json 文档
【发布时间】:2018-02-13 03:41:07
【问题描述】:

我必须承认我不确定 mongodbclient 函数更新内部发生了什么。在我的代码中,我目前有这个:

app.post('/update', function(req, res) {
  const params = req.body;

  const newData = {
    id: params.id,
    data: params.data
    a ton more fields will go here
  };

  db.collection('datas').update({id : params.id}, 
      { $set: {data : newData.data}}, (err, data) => {
            if (!err) {
              res.send({err: false});
            } else {
              res.send({err: true});
            }
 });

但是,我完全不知道整个 $set 括号在做什么,或者一旦传入数据中有大量字段,我如何修改它以覆盖整个文档。我想 id 字段确实不需要更新,但您可以理解。

那个支架在做什么?以及如何根据自己的需要对其进行自定义?

【问题讨论】:

    标签: json node.js mongodb


    【解决方案1】:

    如果您想覆盖整个文档,您可以删除 $set 标记。

    $set 只是设置您传递给它的字段。 如果您没有传递 $set 或 $unset 命令,它将假定您正在尝试覆盖整个文档。

    以下面的文档为例

    {
        _id: 1,
        a: 1,
        b: 2,
        c: 3
    }
    

    使用集合如:

    db.collection.update(
        {_id: 1},
        {$set: {
            a:2,
            b:4,
            new: 123
        }}
    );
    

    将返回以下内容:

    {
        _id: 1,
        a: 2,
        b: 4,
        c: 3,
        new: 123
    }
    

    它会更新传入的 a 和 b,但不会更改 c,因为它没有传入

    使用 $unset 将删除一个字段

    db.collection.update(
        {_id: 1},
        {$unset: {
            new: true
        }}
    );
    

    然后会返回:

    {
        _id: 1,
        a: 2
        b: 4,
        c: 3
    }
    

    不传入 $set 或 $unset 你可以修改整个文档

    db.collection.update(
        {_id: 1},
        {
            comment: "what have I done to my data?!?!?!"
        }
    );
    

    这将返回,保持 _id 不变,但在此过程中覆盖整个文档

    {
        _id: 1,
        comment: "what have I done to my data?!?!?!"
    }
    

    【讨论】:

      【解决方案2】:

      $set 需要一个哈希值。 newData 已经是一个散列了,它就是你需要的散列,所以试试:

      $set: newData
      

      代替

      $set: {data: newData.data}
      

      它应该可以工作。

      【讨论】:

      • 这种场景下hash是什么意思?
      • 对不起,我猜 Javascript 中哈希的正确名称是关联数组。这是一个散列:hash = { id: 1, name: 'John'}。这是一个数组:array = ['blue', 'yellow']
      • 这不会覆盖整个文档,除非每次都传入整个新文档。如果您只想更新单个字段,通常需要 $set(或 $unset)运算符但要替换对象,那么它可能会令人望而却步
      猜你喜欢
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2020-05-14
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多