Quiero actualizar un _idcampo 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 erroren lainsertlínea y no están preocupados por el problema @skelly mencionado, la solución más sencilla es simplemente llamar a laremovelínea primero y luego llamar a lainsertlínea. Eldocya 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 functionpero aparte de eso, gran solución. Además, si desea reemplazar_idcon su identificación personalizada, puede verificar si sedoc._id.toString().length === 24evita 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$projectcontenga todos los campos de su documento, pero omita el campo _id. Luego puede guardarlo con$outEntonces, si su documento es:
Entonces su consulta será:
fuente
_idun 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 _idvalor que desee.fuente