【问题标题】:How to delete an object from an array in mongodb?如何从MongoDB中的数组中删除对象?
【发布时间】:2020-12-13 17:00:23
【问题描述】:

MongoDB 集合/文档:

    {
      _id:something,
      name:something,
      todos: [
          {key:1234},
          {key:5678}
      ]
    }

我想使用 mongoose 查询删除带有 key:5678 的对象。我做了这样的事情,但它根本没有删除对象并返回未更改 todos 数组的用户。

节点路由:

    router.post('/:action', async (req, res) => {
        try {
            if (req.params.action == "delete") {
                const pullTodo = { $pull: { todos: { key: 5678 } } }
                const todo = await User.findOneAndUpdate({ _id:req.body.id} },pullTodo)
                if (todo) {
                    res.json({ msg: "Todo Deleted", data: todo });
                }
            }
        } catch (err) {
            console.log(err)
        }
    })

我也尝试过 findByIdAndUpdate(),update() 方法,但它们都没有从数组中删除对象。结果获取用户而不从数组中删除对象。

【问题讨论】:

  • “它不起作用”是一种观点,而不是问题陈述。 发生了什么,您认为它不起作用?有错误吗? (如果是,显示错误)。日志显示发生了什么? (显示与您的通话相关的部分日志)。你甚至查询了正确的数据库吗? (显示minimal reproducible example 表明您至少已经掌握了基础知识)。有效:记得阅读how to ask a good question 上的政策文章,并尽可能地更新您的帖子。

标签: node.js mongodb mongoose


【解决方案1】:

它正在工作,但是你忘记给Model.findByIdAndUpdate的函数调用配置一个..

const todo = await User.findOneAndUpdate({ _id:req.body.id} },pullTodo, {new: true});
// if {new: true} is enabled, then it will give the latest & updated document from the
// result of the query. By default it gives the previous document.

做一些,先研究。这不是应该问的问题。在stackoverflow中已经回答了好几次了。

【讨论】:

  • 我已经在这里经历了很多问题,这就是我问的原因。说到你的意思,你一定跳过了“查询没有删除对象”这行。我不在乎旧/新文档返回什么。我的第一个座右铭是从数组中删除对象 bro。
  • 看起来您对此感到困惑。但是猫鼬实际上删除了包含{key: 5678} 的对象,但是它没有返回新文档,而是返回了以前的文档,这就是它似乎没有被删除的原因。尝试在不设置 {new:true} 的情况下进行查询并通过 MongoShell/Compass/Atlas 检查数据库,您会看到该数据库已被删除,但之前的文档被返回。
  • 我运行代码并检查了 Mongodb,但 todos 数组仍然没有改变。 Mongoose 不会在 mongodb 上删除 obj。我已经在另一条路线上应用了 push 方法,它就像一个魅力。问题仅与“$pull”有关
  • 那么你的代码的其他部分出了问题。这应该工作得很好。您能否添加当前操作的错误日志。也可以试试console.log(todo) 看看发生了什么
【解决方案2】:

尝试改用Model.findOneAndRemove()。它也只调用一次数据库。

示例:User.findOneAndRemove({'todos':{'$elemMatch':{key}});

【讨论】:

  • 不幸的是,它什么也没做。
【解决方案3】:

您能否像下面那样重新访问您的 JSON,看看这个设计是否适合您。

> db.test6.find()
{ "_id" : "mallik", "name" : "mallik-name", "todos1" : { "key1" : [ 1234, 5678 ] } }
> db.test6.update({},{$pull:{"todos1.key1":5678}},{multi:true});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test6.find()
{ "_id" : "mallik", "name" : "mallik-name", "todos1" : { "key1" : [ 1234 ] } }
>

【讨论】:

    【解决方案4】:

    我正在使用“mongoose.Types.ObjectId()”为每个“Todo”添加一个关键属性,并且我使用 id 字符串进行查询,例如:“5f439 .....”,这就是问题所在。所以我用了:

    1st Step: MongoId = require('mongodb').ObjectID;
    2nd Step: const key = MongoId (**<actual id here>**);
    

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 2023-02-15
      • 2015-08-29
      • 1970-01-01
      • 2019-01-10
      • 2016-03-16
      相关资源
      最近更新 更多