2012-01-28 14 views
34

Sto sviluppando un'app Web utilizzando Codeigniter e MongoDB. Gli utenti possono caricare file e altri utenti possono commentarli.Rimozione di elementi specifici dall'array con MongoDB

Memorizzo i commenti in un array chiamato commenti nel documento file principale. Questo è tutto a posto, ma come posso rimuovere i commenti specifici dalla matrice?

Non riesco a utilizzare l'ID come chiave poiché un utente può aggiungere più commenti. Come direbbe che posso farlo?

Questo è il mio commento matrice:

"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" 
     } 
    ], 

risposta

56

Se si riesce a identificare l'elemento commento di corrispondenza userid, nome o il commento - allora si può rimuovere tale commento utilizzando update() comando con $pull modificatore insieme con la condizione appropriata .

Se non è possibile fare come sopra, includere un ID univoco nei commenti (come UUID).

cancellare il commento, effettuare le seguenti operazioni:

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

Se si utilizza l'ID, che è preferito:

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

Sembra interessante. Posso permettere a mongoDB di assegnare un UUID? Se sì, come? –

+0

No. Per i valori all'interno del documento, come in questo caso, è necessario generare UUID. PHP ha uniqid(), che puoi anche usare. – rsmoorthy

+0

Grazie per una risposta approfondita. I documenti su questo sono poco brillanti. – jcollum

3

forse si può rimuovere il commento di suo 'created_at' di tempo, come il tempo è unico.

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

Più utenti possono pubblicare nello stesso secondo, quindi, vorrei generare un id univoco per ogni commento. –

0

credo, è necessario aggiungere MongoDB id a ogni commento quando inserirla. Puoi creare un nuovo id mongodb come questo;

$comment_id = new MongoID(); 

Ora, è possibile eliminare i commenti per ID con $ tirare + $ aggiornamento come @ di smoorthy risposta.

Problemi correlati