2013-02-27 53 views
10

我在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" 
     } 
    ] 
} 

基本上,收集具有集群,其中集群有一个_id场和members场。成员字段是一组文档,具有以下格式。现在

{ 
      "participationCoeff" : 1, 
      "tweetID" : "5327010328645530500" 
     } 

,不时地,我对会员属性集群文件,通过匹配tweetID删除这些子文件。

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

一些帮助和直觉将会非常有帮助。

回答

15

这也正是$pull运营商做什么,所以在外壳里,你可以使用一个update像:

db.clusters.update({}, 
    {$pull: {members: {tweetID: '5327010328645530500'}}}, 
    {multi: true}) 

设置multi选项,这样,每个文件被更新,不只是第一个。

+1

获取以下错误。 '不能将$ pull/$ pullAll修饰符应用于非数组' – VaidAbhishek 2013-02-27 20:53:11

+1

@VaidAbhishek这意味着您在集合中有一些文档,其中'members'不是数组。 – JohnnyHK 2013-02-27 20:56:05

+0

我不认为我的收藏是这种情况。成员将是一个严格的数组类型属性。 有什么办法使用聚合做到这一点! – VaidAbhishek 2013-02-27 21:01:25

2

这将删除单个查询多个微博只是传递一个数组$在: - 在猫鼬

db.clusters.update({}, 
{$pull: {members: {$in: [ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ] } } }, 

{multi: true}) 

上述方法行不通所以猫鼬的更多信息: -

db.clusters .update({}, {$ pull:{members:[{tweetID:'5327010328645530500'},{“tweetID”:“2820402625046999289”}]}}),