Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

119
Views
Encapsular/Transformar una matriz en una matriz de objetos

Actualmente estoy en el proceso de modificar un esquema y necesito hacer una transformación relativamente trivial usando el marco de agregación y un bulkWrite .

Quiero poder tomar esta matriz:

 { ..., "images" : [ "http://example.com/...", "http://example.com/...", "http://example.com/..." ] }

y agregar a una matriz similar donde se encapsula el valor original :

 { ..., "images" : [ {url: "http://example.com/..."}, {url: "http://example.com/..."}, {url: "http://example.com/..."} ] }

Esta consulta lenta funciona, pero es ridículamente costoso deshacer una colección completa.

 [ { $match: {} }, { $unwind: { path : "$images", } }, { $group: { _id: "$_id", images_2: {$addToSet: {url: "$images"}} } }, ]

¿Cómo se puede lograr esto con el project o alguna otra agregación más barata?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

La expresión $map debería hacer el trabajo, prueba esto:

 db.col.aggregate([ { $project: { images: { $map: { input: '$images', as: 'url', in: { url: '$$url' } } } } } ]);
over 4 years ago · Santiago Trujillo Report

0

No necesita usar el método bulkWrite() para esto.

Puede usar el operador de matriz de agregación $map para aplicar una expresión a cada elemento de su matriz.

Aquí, la expresión simplemente crea un nuevo objeto donde el valor es el elemento de la matriz.

 let mapExpr = { "$map": { "input": "$images", "as": "imageUrl", "in": { "url": "$$imageUrl } } };

Finalmente, puede usar el operador de tubería de agregación $out para sobrescribir su colección o escribir el resultado en una colección diferente.

Por supuesto, $map no es un operador de tubería de agregación, lo que significa que la expresión $map debe usarse en una etapa de tubería.

La forma de hacer esto depende de su versión de MongoDB.

La mejor manera es en MongoDB 3.4 usando $addFields para cambiar el valor del campo "imágenes" en su documento.

 db.collection.aggregate([ { "$addFields": { "images": mapExpr }}, { "$out": "collection } ])

Desde MongoDB 3.2 hacia atrás, debe usar la etapa de canalización $project pero también debe incluir todos los demás campos manualmente en su documento

 db.collection.aggregate([ { "$project": { "images": mapExpr } }, { "$out": "collection } ])
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!