使用MongoDB $ pull删除数组中的文档

Vai*_*hek 15 pull mongodb

我在MongoDB中有一个集合,如下所示:

{
    "_id" : "5327010328645530500",
    "members" : [
        {
            "participationCoeff" : 1,
            "tweetID" : "5327010328645530500"
        },
        {
            "participationCoeff" : 1,
            "tweetID" : "2820402625046999289"
        },
        {
            "participationCoeff" : 0.6666666666666666,
            "tweetID" : "6122060484520699114"
        },
        {
            "participationCoeff" : 1,
            "tweetID" : "4656669980325872747"
        }
    ]
}
{
    "_id" : "2646953848367646922",
    "members" : [
        {
            "participationCoeff" : 1,
            "tweetID" : "2646953848367646922"
        },
        {
            "participationCoeff" : 0.75,
            "tweetID" : "7750833069621794130"
        },
        {
            "participationCoeff" : 0.5,
            "tweetID" : "6271782334664128453"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

基本上,集合具有集群,其中集群具有_id字段和members字段.成员字段是一组文档,具有以下格式.

{
            "participationCoeff" : 1,
            "tweetID" : "5327010328645530500"
        }
Run Code Online (Sandbox Code Playgroud)

现在,我不时地通过匹配tweetID来删除集群文档的成员属性中的这些子文档.

但是,我无法找到实现此效果的查询.基本上,tweetID将参与许多集群,因此将出现在各种集群的"成员"属性的多个子文档中.我想提供批量$ pull操作,我可以删除所有集群中的所有子文档(即其成员属性),这些子文档与特定的tweetID匹配.

一些帮助和直觉将是非常有帮助的.

Joh*_*yHK 25

这正是$pull操作员所做的,所以在shell中你可以使用update类似的东西:

db.clusters.update({}, 
    {$pull: {members: {tweetID: '5327010328645530500'}}}, 
    {multi: true})
Run Code Online (Sandbox Code Playgroud)

设置multi选项以便更新每个文档,而不仅仅是第一个文档.


小智 9

这将multiple tweets在单个查询中删除只是将数组传递给$in: -

db.clusters.update({}, 
{$pull: {members: {$in: [ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ] } } }, 
{multi: true});
Run Code Online (Sandbox Code Playgroud)

上面的方法在猫鼬中不起作用,所以对于猫鼬来说:

 db.clusters.update({}, 
{$pull: {members:[ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ]  } });
Run Code Online (Sandbox Code Playgroud)