【问题标题】:How to delete items out of a nested array by their _id in Mongoose如何通过 Mongoose 中的 _id 从嵌套数组中删除项目
【发布时间】:2021-05-19 02:58:08
【问题描述】:

我有一个模型、用户,每个用户都有一组称为习惯的对象。


{
  _id: 606f1d67aa1d5734c494bf0a,
  name: 'Courtney',
  email: 'c@gmail.com',
  password: '$2b$10$WQ22pIiwD8yDvRhdQ0olBe6JnnFqV2WOsC0cD/FkV4g7LPtUOpx1C',
  __v: 35,
  habits: [
    {
      _id: 6081d32580bfac579446eb81,
      name: 'first',
      type: 'good',
      days: 0,
      checked: false
    },
    {
      _id: 6081d32f80bfac579446eb82,
      name: 'seconds',
      type: 'bad',
      days: 0,
      checked: false
    },
  ]
}

从我的客户端,我发送了一个我想从数组中删除的习惯的 id 列表,看起来像这样..

[
  '6081d32580bfac579446eb81',
  '6081d32f80bfac579446eb82',
]

我正在想办法删除习惯数组中的ID,只删除上面数组中发送ID的习惯。

这是我尝试过的......

router.post('/delete', validate, async (req, res) =>{
  const user = await User.findById(req.user._id)
  const idList = req.body.ids.checkedItems

  const updatedList = user['habits'].filter(habit=> {
    return !idList.includes(`${habit._id}`)
  })

  user['habits'] = updatedList;

    try {
      await user.save()
      res.send(updatedList)

    } catch (err) {
      res.status(400).send(err)
    }
  })

-idList 是字符串形式的 id 数组。
-user['habits'] 从文档中访问列表,用户。
-my filter 方法只返回不包含在 idList 数组中的习惯。因为数组中的id就是要删除的。

这个解决方案显然只是普通的 javascript,我正在寻找的是是否有人知道如何使用 mongoose.js 语法来实现这一点。

我认为您可以通过在模型上使用 deleteMany 或 deleteOne 来做到这一点,但我不确定如何实现这一点。

感谢您抽出宝贵时间提供帮助或提供建议。

【问题讨论】:

标签: javascript node.js database mongodb mongoose


【解决方案1】:

最终对我有用的解决方案是使用模型方法“findByIdAndUpdate”。

const { itemsToDelete } = req.body

  User.findByIdAndUpdate(req.user._id,
    { $pull: { habits: { _id: itemsToDelete } } },
    { new: true , useFindAndModify: false},
    function (err, data) {
      if (err) {
        res.send(err)
      } else {
        res.send(data.habits)
      }
    }
  )

【讨论】:

    【解决方案2】:

    您可以为此使用$pull$in 的组合。

    User.update({_id: userId},
    {
      $pull: {
        habits: {
          _id: {
            $in: [
              ObjectId("6081d32580bfac579446eb81"),
              ObjectId("6081d32f80bfac579446eb82")
            ]
          }
        }
      }
    })
    

    【讨论】:

      猜你喜欢
      • 2014-07-18
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多