Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

124
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda