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

155
Vistas
¿Cómo puedo obtener solo el primer registro coincidente en una combinación de mongoDb mediante la búsqueda?

Imagina dos colecciones de mongo.

FirstCollection tiene este formato:

 { "JoinField": "this is my data" }

SecondCollection tiene este formato (los datos reales son más complejos y necesitan aplanarse):

 { "FirstField" : "food", "SecondField": "bar", "Properties" : { "JoinField": "this is my data" } }

SecondCollection contiene duplicados y estoy tratando de unir las dos tablas y aplanar los datos en una sola proyección.

Esta consulta hará en términos generales lo que quiero:

 db.getCollection('FirstCollection').aggregate([ { "$lookup": { from: 'SecondCollection', localField: 'JoinField', foreignField: 'Properties.JoinField', as: 'secondCollection' } }, { "$unwind": "$secondCollection" }, { "$project": { "JoinField" : 1, firstField : "$secondCollection.FirstField", secondField : "$secondCollection.SecondField", } } ])

El único problema es que esto contiene duplicados en sí mismo porque repite los datos para cada duplicado en SecondCollection que coincide con una línea en FirstCollection.

¿Cómo puedo obtener solo el primer registro (o cualquier copia individual del registro) de SecondCollection?

EDITAR: Disculpas por la falta de claridad. Lo que obtendré actualmente de esa consulta, suponiendo un duplicado en SecondCollection, es esto:

 { "JoinField": "this is my data". "FirstField" : "food", "SecondField": "bar" } { "JoinField": "this is my data". "FirstField" : "food", "SecondField": "bar" }

Lo que quiero es esto:

 { "JoinField": "this is my data". "FirstField" : "food", "SecondField": "bar" }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Intente buscar con canalización de agregación de MongoDB v3.6,

  • let pasar el campo local a la segunda tubería de recolección,
  • pipeline para hacer coincidir el campo y establecer un límite para devolver un solo documento
 { "$lookup": { from: "SecondCollection", let: { "jfield": "$JoinField" }, pipeline: [ { $match: { $expr: { $eq: ["$Properties.JoinField", "$$jfield"] } } }, { $limit: 1 } ], as: "secondCollection" } },

Patio de recreo


Segunda opción de MongoDB v3.2, coloque una etapa $set después $lookup y antes $unwind ,

  • $arrayElemAt elemento devuelto desde una posición específica
 { $set: { secondCollection: { $arrayElemAt: ["$secondCollection", 0] } } }

Patio de recreo

over 4 years ago · Santiago Trujillo Denunciar

0

Si entiendo bien la pregunta, podrías probar esto

 db.b.aggregate([ //Used second collection as the source { "$group": { //Removing duplicates in the join field "_id": "$properties.joinField", FirstField: { "$addToSet": "$FirstField" }, SecondField: { "$addToSet": "$SecondField" }, "JoinField": { $first: "$Properties.JoinField" } } }, { "$lookup": { from: "a", localField: "JoinField", foreignField: "JoinField", as: "FirstCollection" } }, { "$unwind": "$FirstCollection" }, { "$project": { "JoinField": 1, firstField: "$FirstField", secondField: "$SecondField", } } ])
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