如何在mongodb更新调用中覆盖整个json文档

时间:2018-02-12 19:11:16

标签: json node.js mongodb

我必须承认我并不完全确定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字段真的不需要更新,但你可以得到这个想法。

支架在做什么?我如何根据自己的需求进行定制?

2 个答案:

答案 0 :(得分:0)

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

$set: newData

而不是

$set: {data: newData.data}

它应该有用。

答案 1 :(得分:0)

如果您想覆盖整个文档,可以删除$ 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?!?!?!"
}