【问题标题】:How to delete a specific object in an array in MongoDB?如何删除 MongoDB 数组中的特定对象?
【发布时间】:2020-03-19 15:56:25
【问题描述】:

我的数据库如下所示:

_id: 5dd9c43a986f8900178bc588
team: Object
   project:"5dd6cfb4bc97c65a8759a1d4"
   team: Array

    0: Object
       name: "Test User 0"
       role: "Project Lead"

    1: Object
       name: "Test User 1"
       role: "Secretary"

    2: Object
       name: "Test User 2"
       role: "Engineer"

我想动态删除用户,具体取决于在前端选择的用户。假设我只想从数据库中删除名称为“Test User 1”的对象......我正在尝试这个:

  collection_of_projects.updateOne(
            {'_id': ObjectId(team_db_id)}, 
            { $pull: { "team.team.$.name" : {  'name' : team_mate.name }  } },
        false,
        true 
        )

team_db_id 是数据库中的对象 ID,但我收到此错误:

MongoError: The positional operator did not find the match needed from the query.

它似乎找不到我正在搜索的元素,但我错过了什么?请帮忙!

【问题讨论】:

    标签: javascript arrays node.js mongodb mongodb-query


    【解决方案1】:

    我认为您在{ $pull: { "team.team.$.name" : { 'name' : team_mate.name } } } 的查询不正确,您已嵌套team 多次并且在匹配部分,即team_mate.name 也不正确。我已经尝试过以下集合deleteSubDocs,它与$pull 运算符一起工作正常:

    db.deleteSubDocs.update( {_id:ObjectId("5dd9f0670a65bccf463b36ec")}, {$pull: {"team": {"name": "test1"}  }  })
    

    有关$pull 的详细信息,请查看官方文档中的示例,您将自动找出查询中的问题。

    我发现和执行查询的详细信息如下:

    > db.deleteSubDocs.find().pretty()
    {
        "_id" : ObjectId("5dd9f0670a65bccf463b36ec"),
        "team" : [
            {
                "name" : "KP",
                "role" : "Admin"
            },
            {
                "name" : "test1",
                "role" : "role1"
            },
            {
                "name" : "test2",
                "role" : "role 2"
            }
        ]
    }
    > 
    > db.deleteSubDocs.update( {_id:ObjectId("5dd9f0670a65bccf463b36ec")}, {$pull: {"team": {"name": "test1"}  }  })
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.deleteSubDocs.find().pretty()
    {
        "_id" : ObjectId("5dd9f0670a65bccf463b36ec"),
        "team" : [
            {
                "name" : "KP",
                "role" : "Admin"
            },
            {
                "name" : "test2",
                "role" : "role 2"
            }
        ]
    }
    > 
    

    它成功删除了匹配name等于test1的团队数组值,即使您可以在其中进行多个查询。

    【讨论】:

      【解决方案2】:

      UpdateOne() 用于更新记录。您可能想使用 remove()。

      collection_of_projects.remove(
                  {'_id': ObjectId(id_of_team_member)})
      

      【讨论】:

      • 感谢您的建议 - 我认为 removeOne() (remove() is deprecated) 会删除整个文档。我想保留父对象,但只删除数组中的一个对象。
      • 这将删除整条记录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 2017-07-05
      • 1970-01-01
      • 2020-12-13
      • 2011-11-09
      • 1970-01-01
      相关资源
      最近更新 更多