【问题标题】:Unable to update multiple documents [duplicate]无法更新多个文档 [重复]
【发布时间】:2018-02-17 21:52:36
【问题描述】:

我正在尝试更新所有符合以下条件的文档。

出于某种原因,我在控制台中收到错误消息,提示 alerts.save 不是函数。

这就是我更新记录的方式。

我尝试更新多个文档的问题是什么?

router.route('/mark_as_read/:ownerId')
.put(function(req, res){

  var alerts = new Alerts();

  Alerts.find({owner_id: req.params.ownerId}, function(err, alerts){
    if(err)
        res.send(err);

    alerts.viewed = true;
    console.log('Alerts: ', alerts);

    alerts.save(function(err){
      if(err)
        res.send(err);
      res.json(alerts)
    });
  });
});

以下是我执行 get 时返回的数据示例:

  { _id: 59aed31e78fbbea611518ddf,
    message: 'Hammer Hammer at hammer@example.com',
    alert_type: 'Share',
    owner_id: '59a6e66d5ab67150837d96a8',
    __v: 0,
    viewed: false,
    date: 2017-09-05T16:38:54.437Z },
  { _id: 59aed6035fee3fa895045693,
    message: 'Paul Pataa at paul@example.com',
    alert_type: 'Share',
    owner_id: '59a6e66d5ab67150837d96a8',
    __v: 0,
    viewed: false,
    date: 2017-09-05T16:51:15.193Z },
  { _id: 59aedba6fec346aafae9121c,
    message: 'Marky Mark at marks@example.com',
    alert_type: 'Share',
    owner_id: '59a6e66d5ab67150837d96a8',
    __v: 0,
    viewed: false,
    date: 2017-09-05T17:15:18.876Z },
  { _id: 59aedc36fec346aafae91228,
    message: 'Lilly Lap at sammy@example.com',
    alert_type: 'Share',
    owner_id: '59a6e66d5ab67150837d96a8',
    __v: 0,
    viewed: false,
    date: 2017-09-05T17:17:42.951Z }

我尝试遍历警报数组,但这对我不起作用:

router.route('/mark_as_read/:ownerId')
.put(function(req, res){

  var alerts = new Alerts();

  Alerts.find({owner_id: req.params.ownerId}, function(err, alerts){
    if(err)
        res.send(err);

    for(var i=0; i < alerts.length; i++){
      alerts.viewed = true;
      alerts[i].save(function(err){
        if(err)
          console.log('Error in updating an alert');

      })
    }
  });
});

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    find 方法将返回一个数组,因此 alerts.save() 将不起作用。

    您必须遍历数组并在数组中的每个文档上调用 save()

    或者,您可以改用 findOne,这将返回单个文档。

    【讨论】:

    • 谢谢史蒂夫。说得通。我用 alerts 数组上的循环更新了我的示例,但这不起作用。在任何地方我都可以看到处理此问题的明确示例?谢谢你的帮助!!
    • 在这一行 alerts.viewed = true 您试图引用数组本身的 viewed 属性。这样做可能会遇到问题,因为 save 调用将是异步的,但 for 循环将是同步的。因此,我建议您使用 findOnefindById,因为无论如何您只匹配一个文档。
    • 我实际上是在尝试更新所有具有相同 owner_id 的文档。因此,在我的情况下,使用 findOne 或 findById 将不起作用。必须有一种简单的方法来更新多个文档。我发现如何使用 .update 方法在 mongo 中执行此操作,但这在我的 express 应用程序中不起作用。您是否曾经搜索过集合并更改每个返回的文档中的单个字段?这就是我的挑战。再次感谢。我确信答案就在我面前。我只是还没明白。 :-)
    • 使用 multi 选项试一试:Alerts.update({owner_id: req.params.ownerId}, {viewed: true}, {multi: true}, function(err, numAffected) {...}); 所以签名是:Model.update(conditions, update, options, callback);
    • 谢谢,史蒂夫。我实际上在文档中发现了它并且它有效。感谢您的帮助。
    猜你喜欢
    • 2021-06-16
    • 2021-04-08
    • 2018-03-02
    • 2019-09-13
    • 2016-01-13
    • 2020-04-20
    • 1970-01-01
    • 2020-09-26
    相关资源
    最近更新 更多