¿Cómo eliminar un campo por completo de un documento MongoDB?

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

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

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}
TIMEX
fuente

Respuestas:

532

Pruebe esto: si su colección fue 'ejemplo'

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

Consulte esto:

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

ACTUALIZACIÓN :

El enlace anterior ya no cubre '$ unset'ing. 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. Consulte esto para obtener documentación actualizada:

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

Ejemplo:

db.example.update({}, {$unset: {words:1}} , {multi: true});
Shaunak
fuente
1
Consulte la solución a esta pregunta para obtener una explicación de falso / verdadero stackoverflow.com/questions/7714216/…
Dsel
1
Ya no hay un comentario de un "Nic Cottrell" en ninguna parte de esta página :)
Dan Dascalescu
66
¿Me estoy perdiendo algo, o ha estado mal durante más de 8 años, porque tags.wordsdebería estarlo $unset, no words? Ver también la respuesta de Salvador Dalí.
Dan Dascalescu
1
También puede usar en updateManylugar de {multi:true}, es decirdb.example.updateMany({},{"$unset":{words:""}})
Kip
158

Al principio, no entendí por qué la pregunta tiene recompensas (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 era realmente incorrecta.

Sí, debe usar el $unsetoperador , pero este desarmado eliminará la clave de palabras que no existe para un documento para una colección. Entonces, básicamente, no hará nada.

Por lo tanto, debe decirle a Mongo que busque en las etiquetas del documento y luego en las palabras con notación de puntos . Entonces la consulta correcta es.

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

Solo por 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).

Salvador Dalí
fuente
2
Además de esto, si las etiquetas son una matriz, sería así: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Shah
21
db.example.updateMany({},{"$unset":{"tags.words":1}})

También podemos usar esto para actualizar varios documentos.

Vipul
fuente
2
Encuentro esto más claro que pasar false, truecomo los dos últimos argumentos paraupdate()
Kip
17

Para eliminar o eliminar el campo en MongoDB

  • Para un solo registro

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • Para registro múltiple

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
Patel viral
fuente
2

Intenté hacer algo similar a esto, pero eliminé la columna de un documento incrustado. Me tomó un tiempo encontrar una solución y esta fue la primera publicación que encontré, así que pensé en publicar esto aquí para cualquier otra persona que intente hacer lo mismo.

Entonces, digamos que sus datos se ven así:

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

Para eliminar la columna wordsdel documento incrustado, haga esto:

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

o usando el updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

El $unsetsólo se editarla si existe el valor pero no va a hacer una navegación segura (no lo puedo comprobar si tagsexiste primero) por lo que el que existe es necesaria en el documento incrustado.

Esto utiliza el operador posicional completo ( $[]) que se introdujo en la versión 3.6

Jonathon Gardner
fuente
1

Por defecto, el método update () actualiza un solo documento. Configure el parámetro múltiple 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})
Amitesh
fuente
1

Comenzando Mongo 4.2, también es posible usar una sintaxis ligeramente diferente:

// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.update({}, [{ $unset: ["tags.words"] }], { many: true })
// { name: "book", tags: { lat: 33, long: 22 } }

El método de actualización también puede aceptar una tubería de agregación (tenga en cuenta los corchetes que significan el uso de una tubería de agregación).

Esto significa que el $unsetoperador que se está utilizando es el de agregación (en oposición al de "consulta" ), cuya sintaxis toma una matriz de campos.

Xavier Guihot
fuente
1

La solución para PyMongo (Python mongo):

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
Yakir Tsuberi
fuente
0

Y para mongomapper,

  • Documento: cierre
  • Campo para eliminar: shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )

Jon Kern
fuente
0

Debido a que seguí buscando esta página cuando buscaba una forma de eliminar un campo usando MongoEngine, creo que podría ser útil publicar la forma de MongoEngine aquí también:

Example.objects.all().update(unset__tags__words=1)
Lavandería
fuente
-2

{nombre: 'libro', etiquetas: {palabras: ['abc', '123'], lat: 33, largo: 22}}

Respuesta:

db.tablename.remove ({'tags.words': ['abc', '123']})

Poonam Agrawal
fuente
-3

Comprobando si existen "palabras" y luego eliminando del documento

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

verdadero indica actualizar varios documentos si coinciden.

Abhi
fuente
No es necesario verificar la existencia. La documentación establece que: "Si el campo no existe, entonces $ unset no hace nada (es decir, ninguna operación)".
Dan Dascalescu
-4

También puede hacer esto en agregación mediante el proyecto en 3.4

{$ proyecto: {"tags.words": 0}}

joel Raja
fuente
-7

Para hacer referencia a un paquete y eliminar varias "claves", intente esto

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
aspadacio
fuente