Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

343
Vistas
Agregación de MongoDB, combinando 2 arreglos en modo round-robin

Tengo datos en una colección MongoDB que se parece a esto:

 [ { "_id": 1, "type": "big", "fields": [11, 12, 13], "items": [21, 22, 23] }, { "_id": 2, "type": "small", "fields": [14, 15], "items": [24, 25] }, { "_id": 3, "type": "small", "fields": [], "items": [41, 42] }, { "_id": 4, "type": "small", "fields": [31, 32, 33], "items": [] } ]

Me han encargado devolver datos de acuerdo con un procedimiento como este:

Para cada documento de la colección, obtenga 1 valor de sus fields (si los hay) y 1 valor de sus items (si los hay). Concatene todos los resultados en una sola matriz.

Se podría resumir esto como la selección de datos en forma de "intercambio por turnos" de dos matrices contenidas en cada documento.

¿Cómo lograría esto en una consulta de agregación de MongoDB? Esta lógica no es difícil de implementar en el cliente que se conecta al servidor Mongo, pero me gustaría dejar que Mongo se encargue de la paginación (con $skip y $limit ). Estoy usando MongoDB 4.4.

Los datos resultantes se verían así:

 [ { "value": 11, "type": "field", "fromId": 1 }, { "value": 21, "type": "item", "fromId": 1 }, { "value": 14, "type": "field", "fromId": 2 }, { "value": 24, "type": "item", "fromId": 2 }, { "value": 41, "type": "item", "fromId": 3 }, { "value": 31, "type": "field", "fromId": 4 }, ]
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Si entiendo bien tu pregunta; esto debería ser una tubería viable. Para implementar una funcionalidad aleatoria, simplemente ajustaría el índice pasado a $arrayElemAt

https://mongoplayground.net/p/PPXV6fTSwHP

 db.collection.aggregate([ {$project: { types: [ {type: "field", values: "$fields"}, {type: "item", values: "$items"} ] }}, {$unwind: '$types'}, {$project: { _id: 0, value: {$arrayElemAt: ['$types.values', 0]}, type: '$types.type', fromId: '$_id' }}, {$match: { value: {$exists: true} }} ])

La aleatorización se vería así: https://mongoplayground.net/p/qi1Ud53J6yv

 db.collection.aggregate([ {$project: { types: [ {type: "field", values: "$fields"}, {type: "item", values: "$items"} ] }}, {$unwind: '$types'}, {$project: { _id: 0, value: {$arrayElemAt: [ '$types.values', {$floor: {$multiply: [{$rand: {}}, {$size: '$types.values'}]}} ]}, type: '$types.type', fromId: '$_id' }}, {$match: { value: {$exists: true} }} ])
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda