mongodb - operator - mongoose $set
Cómo reemplazar subcadena en documento mongodb (7)
Tengo muchos documentos mongodb en una colección ABC de la forma:
{
....
"URL":"www.abc.com/helloWorldt/..."
.....
}
Quiero reemplazar helloWorldt con helloWorld Final Output:
{
....
"URL":"www.abc.com/helloWorld/..."
.....
}
¿Cómo logro esto para todos los documentos de la colección ABC?
¡Ahora puedes hacerlo!
Podemos usar la secuencia de comandos de Mongo para manipular datos sobre la marcha. ¡Esto funciona para mi!
Yo uso este script para corregir mis datos de dirección.
Ejemplo de dirección actual: "N ° 12, QUINTA AVENIDA".
Quiero eliminar la última coma redundante, la nueva dirección esperada "" Nº12, QUINTA AVENIDA ".
var cursor = db.myCollection.find().limit(100);
while (cursor.hasNext()) {
var currentDocument = cursor.next();
var address = currentDocument[''address''];
var lastPosition = address.length - 1;
var lastChar = address.charAt(lastPosition);
if (lastChar == ",") {
var newAddress = address.slice(0, lastPosition);
currentDocument[''address''] = newAddress;
db.localbizs.update({_id: currentDocument._id}, currentDocument);
}
}
¡Espero que esto ayude!
Actualmente, no puede usar el valor de un campo para actualizarlo. Por lo tanto, deberá repetir los documentos y actualizar cada documento con una función. Hay un ejemplo de cómo podrías hacer eso aquí: MongoDB: actualizar documentos usando datos del mismo documento
El formato de mi comentario a la respuesta seleccionada (respuesta de @ Naveed) se ha codificado, por lo que se agrega esto como respuesta. Todo el mérito es para Naveed.
-------------------------------------------------- --------------------
Simplemente impresionante. Mi caso fue - Tengo un campo que es una matriz - así que tuve que agregar un bucle adicional.
Mi consulta es:
db.getCollection("profile").find({"photos": {$ne: "" }}).forEach(function(e,i) {
e.photos.forEach(function(url, j) {
url = url.replace("http://a.com", "https://dev.a.com");
e.photos[j] = url;
});
db.getCollection("profile").save(e);
eval(printjson(e));
})
Por si acaso, si utiliza ejemplos de las respuestas aquí y obtiene "Actualizado 0 registros existentes" cuando ejecuta su script de reemplazo, verifique si su cliente está conectado al nodo MongoDB primario que le permite almacenar / escribir cambios.
Puede probar debajo de la canalización de agregación en la versión 3.4
.
Consulta de agregación para reemplazar la cadena de búsqueda con la cadena de reemplazo.
La lógica es ubicar la cadena de búsqueda ( $indexOfCP
) seguida por $concat
para unir todas las partes ( $substrCP
), la parte antes de la cadena de búsqueda coincidente, la cadena de reemplazo y el resto de la cadena original.
Actualización masiva para escribir la nueva estructura de url.
var bulk = db.getCollection(col).initializeUnorderedBulkOp();
var count = 0;
var batch = 1;
db.getCollection(col).aggregate([
{"$project":{
"URL":{
"$let":{
"vars":{
"len":{
"$strLenCP":"helloWorldt"},"start":{"$indexOfCP":["$URL","helloWorldt"]}
},
"in":{
"$concat":[
{"$substrCP":["$URL",0,"$$start"]},
"helloWorld",
{"$substrCP":[
"$URL",
{"$add":["$$start","$$len"]},
{"$subtract":[{"$strLenCP":"$URL"},{"$add":["$$start","$$len"]}]}
]}
]
}
}
}
}}
]).forEach(function(doc){
var _id = doc._id;
var url = doc.URL;
bulk.find({ "_id" : _id }).updateOne(
{ $set: {"URL" : url } }
);
count++;
if (count == batch) {
bulk.execute();
bulk = db.getCollection(col).initializeUnorderedBulkOp();
count = 0;
}
});
if (count > 0) {
bulk.execute();
}
nodejs. Usando el paquete mongodb de npm
db.collection(''ABC'').find({url: /helloWorldt/}).toArray((err, docs) => {
docs.forEach(doc => {
let URL = doc.URL.replace(''helloWorldt'', ''helloWorld'');
db.collection(''ABC'').updateOne({_id: doc._id}, {URL});
});
});
db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
e.url=e.url.replace("//a.n.com","//b.n.com");
db.media.save(e);
});