2012-01-28 14 views
34

Estoy desarrollando una aplicación web usando Codeigniter y MongoDB. Los usuarios pueden subir archivos y otros usuarios pueden comentar sobre ellos.Eliminando elementos específicos de una matriz con MongoDB

Guardo los comentarios en una matriz llamada comentarios en el documento de archivo principal. Esto está bien, pero ¿cómo puedo eliminar comentarios específicos de la matriz?

No puedo usar ID como clave ya que un usuario puede agregar varios comentarios. ¿Cómo podría recomendar que puedo hacerlo?

Este es mi comentario matriz:

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

Respuesta

56

Si se puede identificar el elemento comentario, haciendo coincidir ID de usuario, nombre o comentario - entonces usted puede quitar ese comentario mediante update() comando con $pull modificador junto con la condición apropiada .

Si no puede hacer lo anterior, incluya una identificación única en los comentarios (como UUID).

eliminar el mensaje, haga lo siguiente:

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

Si se utiliza el ID, que se prefiere:

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

Suena interesante. ¿Puedo dejar que mongoDB asigne un UUID? Si es así, ¿cómo? –

+0

No. Para valores dentro de su documento, como en este caso, necesita generar UUID. PHP tiene uniqid(), que también puedes usar. – rsmoorthy

+0

Gracias por una respuesta completa. Los documentos de este son mediocres. – jcollum

3

tal vez usted puede quitar comentario por su 'created_at' tiempo, como el tiempo es único

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

Múltiples usuarios pueden publicar en el mismo segundo, así que generaría una identificación única para cada comentario. –

0

Creo que ha agregado la id de mongodb a cada comentario cuando lo inserta. Puedes crear una nueva ID de mongodb como esta;

$comment_id = new MongoID(); 

Ahora, puede eliminar los comentarios por ID con $ pull + $ update como la respuesta de @ smoorthy.

Cuestiones relacionadas