varios valor update una registro mas insertar inserta documentos crear consultas complejas como comandos coleccion actualizar mongodb

valor - ¿Cómo actualizar el_id de un Documento MongoDB?



mongodb actualizar registro (3)

Quiero actualizar un _id MongoDB de un documento. Sé que no es una buena práctica. Pero con alguna razón técnica, necesito actualizarlo. Pero si trato de actualizarlo, tengo:

> db.clients.update({''_id'':ObjectId("4cc45467c55f4d2d2a000002")}, {''$set'':{''_id'':ObjectId("4c8a331bda76c559ef000004")}}); Mod on _id not allowed

Y la actualización no está hecha. ¿Cómo puedo actualizarlo realmente?


En el caso, desea renombrar _id en la misma colección (por ejemplo, si desea anteponer algunos _ids):

db.someCollection.find().snapshot().forEach(function(doc) { if (doc._id.indexOf("2019:") != 0) { print("Processing: " + doc._id); var oldDocId = doc._id; doc._id = "2019:" + doc._id; db.someCollection.insert(doc); db.someCollection.remove({_id: oldDocId}); } });

if (doc._id.indexOf ("2019:")! = 0) {... necesario para evitar el bucle infinito, ya que forEach elige los documentos insertados, incluso a través del método .snapshot () utilizado.


No puedes actualizarlo. Deberá guardar el documento utilizando un nuevo _id y luego eliminar el documento anterior.

// store the document in a variable doc = db.clients.findOne({_id: ObjectId("4cc45467c55f4d2d2a000002")}) // set a new _id on the document doc._id = ObjectId("4c8a331bda76c559ef000004") // insert the document, using the new _id db.clients.insert(doc) // remove the document with the old _id db.clients.remove({_id: ObjectId("4cc45467c55f4d2d2a000002")})


Para hacerlo para toda su colección también puede usar un bucle (basado en el ejemplo de Niels):

db.status.find().forEach(function(doc){ doc._id=doc.UserId; db.status_new.insert(doc); }); db.status_new.renameCollection("status", true);

En este caso UserId era la nueva ID que quería usar