2013-02-27 11 views
10

Mam kolekcję w MongoDB, który jest jak następuje:

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

Zasadniczo, kolekcja mają klastry, w których klaster ma pole _id i pole members. Pole Członkowie jest zbiorem dokumentów o następującym formacie.

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

Teraz, od czasu do czasu, muszę usunąć te dokumenty podrzędne członkowie atrybut dokumentu klastra, dopasowując tweetID.

Jednak nie mogę znaleźć zapytania, aby uzyskać ten efekt. Zasadniczo identyfikator tweetID będzie uczestniczył w wielu klastrach, a zatem pojawi się w wielu pod-dokumentach o atrybutach "członków" różnych klastrów. Chcę dostarczyć operację zbiorczego pobierania $, w której mogę usunąć wszystkie dokumenty podrzędne we wszystkich klastrach (to jest atrybut ich członków), które pasują do określonego identyfikatora tweetID.

Pomoc i intuicja będą naprawdę pomocne.

Odpowiedz

15

To jest dokładnie to, co robi operator $pull, więc w powłoce można użyć update jak:

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

Ustaw opcję multi tak, że każdy dokument jest aktualizowany, a nie tylko pierwszego.

+1

uzyskiwanie następującego błędu. 'Nie można zastosować $ pull/$ pullAll modyfikator do tablicy innej niż" – VaidAbhishek

+1

@VaidAbhishek Oznacza to, że masz trochę dokumentów w kolekcji, gdzie 'member' nie jest tablicą. – JohnnyHK

+0

Nie sądzę, że tak jest w przypadku mojej kolekcji. członkowie będą atrybutem ściśle typu tablicowego klastra. Czy można to zrobić za pomocą agregacji! – VaidAbhishek

2

To będzie usunąć wiele tweets w jednym zapytaniu tylko przekazać tablicę do $ w: -

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

{multi: true}) 

powyższych prac metoda nie robi w mangusta więc dla mangusta temat: -

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

Powiązane problemy