Quiero actualizar un _id
campo de un documento. Sé que no es una muy buena práctica. Pero con alguna razón técnica, necesito actualizarlo. Si trato de actualizarlo obtengo:
> db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})
Performing an update on the path '_id' would modify the immutable field '_id'
Y la actualización no se realiza. ¿Cómo puedo actualizarlo?
duplicate key error
en lainsert
línea y no están preocupados por el problema @skelly mencionado, la solución más sencilla es simplemente llamar a laremove
línea primero y luego llamar a lainsert
línea. Eldoc
ya debería estar impreso en su pantalla para que sea fácil de recuperar, en el peor de los casos, incluso si falla la inserción, para documentos simples.Para hacerlo para toda su colección, también puede usar un bucle (basado en el ejemplo de Niels):
En este caso, UserId era la nueva ID que quería usar
fuente
list()
es el lógico, pero para grandes bases de datos esto puede agotar la memoriaEn el caso, desea cambiar el nombre de _id en la misma colección (por ejemplo, si desea prefijar algunos _ids):
if (doc._id.indexOf ("2019:")! = 0) {... necesario para evitar el bucle infinito, ya que forEach selecciona los documentos insertados, incluso a través del método .snapshot () utilizado.
fuente
find(...).snapshot is not a function
pero aparte de eso, gran solución. Además, si desea reemplazar_id
con su identificación personalizada, puede verificar si sedoc._id.toString().length === 24
evita el bucle infinito (suponiendo que sus identificaciones personalizadas no tengan también 24 caracteres de largo ),Aquí tengo una solución que evita múltiples solicitudes, para bucles y eliminación de documentos antiguos.
Puede crear fácilmente una nueva idea manualmente usando algo como:
_id:ObjectId()
Pero sabiendo que Mongo asignará automáticamente un _id si falta, puede usar el agregado para crear un que$project
contenga todos los campos de su documento, pero omita el campo _id. Luego puede guardarlo con$out
Entonces, si su documento es:
Entonces su consulta será:
fuente
_id
un valor dado, en lugar de dejar que MongoDB genere otro.También puede crear un nuevo documento desde la brújula MongoDB o mediante el comando y establecer el
specific _id
valor que desee.fuente