【问题标题】:Unable to remove item from array using Mongoose / UpdateOne无法使用 Mongoose / UpdateOne 从数组中删除项目
【发布时间】:2021-05-23 22:29:17
【问题描述】:

我有一个 Node.js 应用程序,我在其中尝试在 API 端点被命中时从数组中删除一个对象。到目前为止,我一直无法让它更新/删除对象。目前,以下查询返回没有错误,但在检查我的数据库时,我仍然看到它。以下是我的查询和基本回复(我将添加更多内容,但这超出了本问题的范围)。我还包含了我的数据模型的示例。 在下面的数据模型中,我试图从 foo 数组中删除整个对象,因为它不再需要了。 代码

const ID = req.params.id
await FooBar.updateOne({foo: {$elemMatch: {v_code: ID}}}, { $pull: {v_code: ID}}, (err) => {
   if(err) return res.json({success: false, err})
   return res.json({success: true, id: ID})
})

数据模型

{
  bar: [
     {
       foo: [
         {
             v_code: <>
             _id: <>
          }
       ]
     }
  ]
}

我确定在其他问题中已经提出了这个问题,但没有针对我的数据模型。我尝试将多个 SO 帖子拼凑在一起,这就是我得到查询的 $elemmatch 和 $pull 部分的方式,到目前为止我的运气为零

【问题讨论】:

  • 查看docs 中的示例以获取匹配和修改的文档数量。您的查询是否匹配任何文档?
  • @Joe 它应该匹配一个文档,我已经检查了 mongo atlas 控制台,看到一个具有我要查找的键的正确值的那个。我只是按照您的建议进行操作并尝试查看返回的文档数,它显示为 0。不知道为什么,我已经确认键/值是有效的,尽管可能是因为元素不是顶级元素?我不能直接在elemmeatch 中定位v_code,因为它也出现在(不同的值)foo 的旧值数组中
  • MongoDB 查询运算符是类型敏感的。确保ID 的类型与数据库中的数据类型匹配。从数据模型看来foo嵌套在bar中,你试过匹配{"bar.foo.v_code": ID}吗?
  • @Joe 两者都是这样认为的字符串,只是对 console.log 做了一个小测试来确认,我是正确的
  • 可能选择器对查询无效?

标签: javascript node.js mongodb mongoose


【解决方案1】:

试试下面的命令:

db.collection.updateOne(
    {
        "bar.foo.v_code": ID
    },
    {
        $pull: { bar: { foo: { $elemMatch: { v_code: ID } } } }
    }
)

https://mongoplayground.net/p/iqJki-mnHSJ

【讨论】:

    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2015-03-15
    • 2021-10-07
    相关资源
    最近更新 更多