【问题标题】:Mongoose updating a document by removing a single object from documentMongoose 通过从文档中删除单个对象来更新文档
【发布时间】:2016-09-14 15:55:57
【问题描述】:

找不到解决办法:(

我正在使用 Node、express 和 mongoose 做一个联系人应用程序。

当用户去路由/contact/:id

这个查询被执行:

Contact.findOne(req.dbQuery, function(err, data) {
    res.json(data);
});

响应是:

 {
     _id: 57 d71ceb57658ba24866a1b0,
     __v: 0,
     firstName: ['Doe', 'text'],
     lastName: ['John', 'text'],
     id: 4,
     homePhone: ['', 'tel'],
     cellPhone: ['', 'tel'],
     birthday: ['', 'date'],
     website: ['', 'url'],
     address: ['test Adress', 'text'],
 }

数组中的每一项都以标签和文本框的形式显示在页面上

使用 ng-repeat。

在每个文本框旁边我有一个 X 按钮来删除一个文本框。

在每个 X 按钮上都有 ng-click="remove(field)"

$scope.remove = function(field){ //field can be 'homePhone' or any item 
     delete $scope.record[field];
     $scope.record.$update(function(updatedRecord){
         $scope.record = updatedRecord;
       }) 
     };

问题是,当我点击 X 按钮并调用时

remove('homePhone') (或任何字段 - 'cellPhone' 或任何其他)

我正在通过 req.body 向服务器发送正确的数据(我可以看到数据

没有删除的字段)但得到一个响应,包括我刚刚的字段

已删除。

在我正在执行的服务器上:

Contact.findOneAndUpdate({
    _id: contact._id
}, req.body, {
    upsert: true,
    new: true
}, function(err, data) {
    res.json(data);
});

我还有一个“添加新字段”按钮,通过添加项目来添加文本框

到数组。我在添加新字段时执行相同的查询

这就是我使用 {upsert: true, new: true} 的原因

我必须改变一切吗?

非常感谢

【问题讨论】:

  • 您如何在 findOneAndUpdate 中获得“联系人”?

标签: javascript node.js mongodb express mongoose


【解决方案1】:

请使用$unset 运算符从文档中删除任何字段。这是执行更新时的首选方式或从文档中删除字段。

【讨论】:

  • 我试图 $unset 一个字段,但它并没有完全删除它。钥匙仍然留在文件上。我在键上使用 ng-repeat 进行迭代,并将它们作为文本框的标签呈现。我需要彻底删除对象
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2015-02-19
相关资源
最近更新 更多