MongoDB更新的对象与项目删除不保存

耶罗

我正在将Angular Fullstack用于Web应用程序。

我按$http.post()对象发布数据

{ title: "Some title", tags: ["tag1", "tag2", "tag3"] }

当我编辑对象并尝试执行$http.put()以下操作时:

{ title: "Some title", tags: ["tag1"] }

在控制台中,我得到了,HTTP PUT 200但是当我刷新页面时,我仍然使用所有3个标记来接收该对象。

这是我保存在MongoDB中的方式:

exports.update = function(req, res) {
  if (req.body._id) {
    delete req.body._id;
  }

  Question.findByIdAsync(req.params.id)
    .then(handleEntityNotFound(res))
    .then(saveUpdates(req.body))
    .then(responseWithResult(res))
    .catch(handleError(res));
};


function saveUpdates(updates) {

  return function(entity) {

    var data = _.merge(entity.toJSON(), updates);
    var updated = _.extend(entity, data);

    return updated.saveAsync()
      .spread(function(updated) {
        return updated;
      });
  };
}

有人可以解释如何保存带有已删除项目的对象吗?

我做错了什么?

布雷克七世

从数据库检索后,使用诸如_.merge_.extend在客户端(意味着您的nodejs客户端到数据库而不是浏览器)代码中使用或之类的东西,这是非常糟糕的做法同样值得注意的_.merge是这里的问题,因为它不会“拿走”东西,而是“扩大”您提供的信息中已经存在的东西。这不是您想要的,但是还有更好的方法。

您应该只使用“原子运算符”$set来代替:

Question.findByIdAndUpdateAsync(
    req.params.id,
    { "$set": { "tags": req.body.tags } },
    { "new": true }
)
.then(function(result) {
    // deal with returned result
});

您实际上也应该以端点为目标,并且没有“通用”对象写操作。因此,对象只能专门针对相关“标签”的“ PUT”,而不会接触对象中的其他字段。

如果确实必须向其扔一个完整的对象并希望从所有内容中进行更新,请使用帮助程序来正确修复更新语句:

function dotNotate(obj,target,prefix) {
  target = target || {},
  prefix = prefix || "";

  Object.keys(obj).forEach(function(key) {
    if ( typeof(obj[key]) === "object" ) {
      dotNotate(obj[key],target,prefix + key + ".");
    } else {
      return target[prefix + key] = obj[key];
    }
  });

  return target;
}

var update = { "$set": dotNotate(req.body) };

Question.findByIdAndUpdateAsync(
    req.params.id,
    update,
    { "new": true }
)
.then(function(result) {
    // deal with returned result
});

无论您向其扔什么对象,哪种结构都将正确构造。

尽管在这种情况下,可能直接就足够了:

Question.findByIdAndUpdateAsync(
    req.params.id,
    { "$set": req.body },
    { "new": true }
)
.then(function(result) {
    // deal with returned result
});

原子运算符还有其他一些方法,您也可以将它们放入逻辑中进行处理。但最好考虑的是,您至少要对根文档属性以及像数组这样的东西分别作为子元素进行处理,才能对每个元素执行这些操作。

所有原子操作都与文档“在数据库中”和“修改时”交互。从数据库中提取数据,对其进行修改,然后再进行保存,这并不能保证数据尚未更改,而您可能会覆盖已经提交的其他更改。

我是真的,您的“浏览器客户端”应该已经意识到“标签”数组具有其他两个条目,然后您的“修改请求”应该只是$pull要从数组中删除的条目,如下所示:

Question.findByIdAndUpdateAsync(
    req.params.id,
    { "$pull": { "tags": { "$in": ["tag2", "tag3"] } } },
    { "new": true }
)
.then(function(result) {
    // deal with returned result
});

然后,无论“修改”服务器上文档的当前状态如何,这些更改都是唯一的更改。因此,如果在添加的“ tag4”处进行了其他修改,并且客户端在发送修改之前尚未获得此类更改的通知,则返回响应也将包括该更改,并且所有内容将保持同步。

了解MongoDB更新修饰符,因为它们会很好地为您服务。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Mongoose / MongoDB不保存对象

来自分类Dev

laravel mongodb不保存

来自分类Dev

Rails 4在不保存的情况下更新对象内容

来自分类Dev

更新mongodb对象中的项目

来自分类Dev

Mongodb 不保存文档

来自分类Dev

关闭对象而不保存更改

来自分类Dev

Android DBFlow不保存对象

来自分类Dev

Rails更新不保存值

来自分类Dev

队列不保存更新的数据

来自分类Dev

如何在不保存的情况下更新尚未保存的对象?

来自分类Dev

Django Rest Framework序列化程序更新方法不保存对象

来自分类Dev

实体框架:代码优先:为什么更新时不保存关系/关联对象?

来自分类Dev

在对象上更新时不保存 C# 布尔值

来自分类Dev

实体框架不保存新项目

来自分类Dev

对象上的Typescript useState钩子不保存

来自分类Dev

修改的JPARepository CPRQ不保存完整对象

来自分类Dev

Django方法相同的对象不保存

来自分类Dev

解析后台作业不保存对象

来自分类Dev

EF7不保存对象图

来自分类Dev

ActiveAdmin中的嵌套表单不保存更新

来自分类Dev

在不保存的情况下更新关联

来自分类Dev

MongoDB从对象数组内的数组中删除项目

来自分类Dev

Audacity:仅保存声音文件,而不保存项目

来自分类Dev

保存Matlab工作区而不保存或删除图形

来自分类Dev

从对象中删除项目

来自分类Dev

C#-ObservableCollection似乎不保存添加的项目

来自分类Dev

在mongodb中保存对象

来自分类Dev

mongodb + express-猫鼬不保存“默认”值

来自分类Dev

如何创建Grails域对象但不保存?