2012-01-28 11 views
34

Pracuję nad aplikacją internetową wykorzystującą Codeigniter i MongoDB. Użytkownicy mogą przesyłać pliki, a inni użytkownicy mogą je komentować.Usuwanie określonych elementów z macierzy za pomocą MongoDB

Przechowuję komentarze w tablicy zwanej komentarzami w dokumencie głównym pliku. To wszystko dobrze, ale jak mogę usunąć konkretne komentarze z tablicy?

Nie mogę użyć identyfikatora jako klucza, ponieważ użytkownik może dodać wiele komentarzy. W jaki sposób poleciłbyś, że mogę to zrobić?

To jest mój komentarz tablica:

"comments": [ 
     { 
      "user_id": ObjectId("4f240b433dc7937d68030000"), 
      "user_name": "james", 
      "user_comment": "This is a comment", 
      "created_at": "2012-01-2821: 20: 44" 
     }, 
     { 
      "user_id": ObjectId("4f240b433dc7937d68030000"), 
      "user_name": "mandy", 
      "user_comment": "This is another comment", 
      "created_at": "2012-01-2821: 31: 07" 
     } 
    ], 

Odpowiedz

56

Jeśli można zidentyfikować przedmiot komentarz dopasowując USERID nazwę lub komentarz - wtedy możesz usunąć ten komentarz używając polecenia update() z $pull modyfikatora wraz z odpowiednim stanie .

Jeśli nie możesz zrobić jak powyżej, dołącz unikalny identyfikator w komentarzach (np. UUID).

Aby usunąć komentarz, wykonaj następujące czynności:

db.coll.update({<cond to identify document}, {$pull: {'comments': {'name': <name>}}}) 

Jeśli używasz identyfikator, który jest preferowany:

db.coll.update({<cond to identify document}, {$pull: {'comments': {'id': <id>}}}) 
+0

Brzmi interesująco. Czy mogę pozwolić, aby mongoDB przydzielił UUID? Jeśli tak, w jaki sposób? –

+0

Nie. Dla wartości w dokumencie, tak jak w tym przypadku, musisz wygenerować identyfikator UUID. PHP ma unikqid(), którego możesz również użyć. – rsmoorthy

+0

Dzięki za dokładną odpowiedź. Dokumenty na ten są słabe. – jcollum

3

może można usunąć komentarz przez jego „created_at” czasu, jak czas jest wyjątkowy.

$db.coll.update({cond to identify document},{$pull:{'comments':{'created_at':<>}}}) 
+0

Wielu użytkowników może publikować posty w tej samej sekundzie, więc wygeneruję unikalny identyfikator dla każdego komentarza. –

0

Myślę, że dodajecie mononom id do każdego komentarza po wstawieniu go. Możesz stworzyć nowy identyfikator mongodb w ten sposób;

$comment_id = new MongoID(); 

Teraz można usuwać komentarze według identyfikatora za pomocą $ pull + $ update like @ smoorthy's answer.

Powiązane problemy