繁体   English   中英

如何删除MongoDB中数组中的特定对象?

[英]How to delete a specific object in an array in MongoDB?

我的数据库看起来像这样:

_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.

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

我认为您在{ $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匹配的 team 数组值等于test1 ,即使您可以在其中创建多个和查询。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM