2013-02-27 15 views
10

ho una collezione in MongoDB, che è come segue:

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

In sostanza, la raccolta ha cluster, in cui un gruppo ha un campo _id e un campo members. Il campo Membri è una serie di documenti, con il seguente formato.

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

Ora, di tanto in tanto, devo eliminare questi sotto-documenti in membri attribuiscono documento cluster, abbinando tweetID.

Tuttavia, non sono in grado di trovare una query per ottenere questo effetto. Fondamentalmente, un tweetID parteciperà a molti cluster e quindi apparirà in più sotto-documenti dell'attributo 'membri' di vari cluster. Voglio fornire un'operazione bulk $ pull, in cui posso rimuovere tutti i documenti secondari in tutti i cluster (vale a dire l'attributo dei membri) che corrispondono a un particolare tweetID.

Alcuni aiuti e intuizioni saranno davvero utili.

risposta

15

Questo è esattamente ciò che l'operatore $pull fa, quindi nella shell si potrebbe usare un update come:

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

Impostare l'opzione multi in modo che ogni documento è aggiornato, non solo il primo.

+1

errore di ricezione. 'Impossibile applicare $ pull/$ pullAll modificatore a non-array' – VaidAbhishek

+1

@VaidAbhishek Ciò significa che nella raccolta sono presenti alcuni documenti in cui' members' non è una matrice. – JohnnyHK

+0

Non penso che sia il caso della mia collezione. i membri saranno un attributo di tipo strettamente array del cluster. C'è un modo per farlo usando l'aggregazione! – VaidAbhishek

2

Questo cancellerà più tweets in una singola query solo passare un array a $ in: -

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

{multi: true}) 

È possibile che questo metodo di lavoro incaricato di tirare in mangusta così per mangusta fare: -

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

Problemi correlati