¿Cómo eliminar un campo completamente de un documento MongoDB?


{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

Supongamos que esto es un documento. ¿Cómo elimino "words " completamente de todos los documentos de esta colección? Quiero que todos los documentos estén sin "words":

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}
Author: Community, 2011-07-28

8 answers

Prueba esto: Si tu colección era 'ejemplo'

db.example.update({}, {$unset: {words:1}}, false, true);

Refiérase a esto:

Http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

ACTUALIZACIÓN :

El enlace anterior ya no cubre 'un unset'. El comentario de Nic Cottrell a continuación es el camino a seguir ahora. Asegúrese de agregar {multi: true} si desea eliminar este campo de todos los documentos de la colección; de lo contrario, solo lo eliminará del primer documento que encuentre que coincida. Ver documentación actualizada:

Https://docs.mongodb.com/manual/reference/operator/update/unset /

Ejemplo:

db.example.update({}, {$unset: {words:1}} , {multi: true});
 369
Author: Shaunak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-29 19:49:26

Al principio, no entendí por qué la pregunta tiene una recompensa (pensé que la pregunta tiene una buena respuesta y no hay nada que agregar), pero luego me di cuenta de que la respuesta que fue aceptada y votada 15 veces estaba realmente equivocada!

Sí, tienes que usar $unset operator, pero este unset va a eliminar la clave de palabras que no existe para un documento para una colección. Así que básicamente no hará nada.

Así que necesitas decirle a Mongo que busque en el documento etiquetas y luego en las palabras usando notación de punto . Así que la consulta correcta es.

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

Solo para completar, me referiré a otra forma de hacerlo, que es mucho peor, pero de esta manera puede cambiar el campo con cualquier código personalizado (incluso basado en otro campo de este documento).

 125
Author: Salvador Dali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-25 11:44:43

Para eliminar o eliminar el campo en MongoDB

  • Para un solo Registro

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
    
  • Para Múltiples Registros

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
    
 15
Author: Viral Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-23 07:36:24
db.example.updateMany({},{"$unset":{"tags.words":1}})

También podemos usar esto para actualizar varios documentos.

 4
Author: Vipul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 13:41:33

De forma predeterminada, el método update() actualiza un solo documento. Establezca el parámetro Multi para actualizar todos los documentos que coincidan con los criterios de consulta.

Cambiado en la versión 3.6. Sintaxis :

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

Ejemplo:

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

En tu ejemplo :

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})
 0
Author: FullStack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-09 18:07:46

Comprobar si "words" existe y luego eliminar del documento

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

True indica actualizar varios documentos si coinciden.

 -1
Author: Abhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-24 22:05:08

También puede hacer esto en agregación usando project en 3.4

{project project: {"tags.words": 0}}

 -3
Author: joel Raja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-02 08:49:12

Para hacer referencia a un paquete y eliminar varias teclas "", prueba esto

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
 -6
Author: aspadacio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-17 05:21:43