2013-02-27 4 views
10

ich eine Sammlung in MongoDB haben, die wie folgt lautet:

{ 
    "_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" 
     } 
    ] 
} 

Grundsätzlich haben Sammlung Cluster, wo ein Cluster ein _id Feld und ein members Feld hat. Mitgliederfeld ist ein Array von Dokumenten mit folgendem Format.

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

Jetzt von Zeit zu Zeit, ich habe diese Unter Dokumente löschen Mitglieder des Cluster-Dokumentattribut, durch tweetID entsprechen.

Ich bin jedoch nicht in der Lage, eine Abfrage zu finden, um diesen Effekt zu erzielen. Grundsätzlich wird eine tweetID an vielen Clustern teilnehmen und daher in mehreren Unterdokumenten des 'members'-Attributs verschiedener Cluster erscheinen. Ich möchte eine Bulk $ pull-Operation bereitstellen, in der ich alle Unterdokumente in allen Clustern (d. H. Ihr Attribut "members") entfernen kann, die mit einer bestimmten tweetID übereinstimmen.

Einige Hilfe und Intuition werden sehr hilfreich sein.

Antwort

15

Das ist genau das, was der $pull Betreiber der Fall ist, so in der Schale Sie ein update wie verwenden:

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

die multi Option so ein, dass jedes Dokument aktualisiert wird, nicht nur die erste.

+1

erhalten folgenden Fehler. '$ pull/$ pullAll-Modifizierer kann nicht auf Nicht-Array angewendet werden. – VaidAbhishek

+1

@VaidAbhishek Das bedeutet, dass Sie einige Dokumente in der Sammlung haben, in denen' members' kein Array ist. – JohnnyHK

+0

Ich denke nicht, dass das bei meiner Sammlung der Fall ist. Mitglieder sind ein streng Array-Typ-Attribut des Clusters. Gibt es eine Möglichkeit, dies mit Aggregation zu tun! – VaidAbhishek

2

Dies wird mehrere Tweets in einer einzigen Abfrage löschen nur ein Array $ in geben: -

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

{multi: true}) 

die oben Arbeitsweise leider nicht in der Mungo so für Mungo tun: -

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

Verwandte Themen