{
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
}
}
mongodb
mongodb-query
database
TIMEX
fuente
fuente
tags.words
debería estarlo$unset
, nowords
? Ver también la respuesta de Salvador Dalí.updateMany
lugar de{multi:true}
, es decirdb.example.updateMany({},{"$unset":{words:""}})
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
$unset
operador , 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.
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).
fuente
También podemos usar esto para actualizar varios documentos.
fuente
false, true
como los dos últimos argumentos paraupdate()
Para eliminar o eliminar el campo en MongoDB
Para un solo registro
Para registro múltiple
fuente
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í:
Para eliminar la columna
words
del documento incrustado, haga esto:o usando el
updateMany
El
$unset
sólo se editarla si existe el valor pero no va a hacer una navegación segura (no lo puedo comprobar sitags
existe 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.6fuente
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:
Ejemplo:
En tu ejemplo:
fuente
Comenzando
Mongo 4.2
, también es posible usar una sintaxis ligeramente diferente: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
$unset
operador que se está utilizando es el de agregación (en oposición al de "consulta" ), cuya sintaxis toma una matriz de campos.fuente
La solución para PyMongo (Python mongo):
fuente
Y para mongomapper,
Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )
fuente
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:
fuente
{nombre: 'libro', etiquetas: {palabras: ['abc', '123'], lat: 33, largo: 22}}
Respuesta:
db.tablename.remove ({'tags.words': ['abc', '123']})
fuente
Comprobando si existen "palabras" y luego eliminando del documento
verdadero indica actualizar varios documentos si coinciden.
fuente
También puede hacer esto en agregación mediante el proyecto en 3.4
{$ proyecto: {"tags.words": 0}}
fuente
Para hacer referencia a un paquete y eliminar varias "claves", intente esto
fuente