es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener el campo que tiene el mismo valor en una colección de MongoDB.

Tengo un documento en mi colección de mongo db:

{
“_id” : ObjectId(“xxxxxxx”),
“ID” : “a_11”,
“details_list” : [
{
“detail” : “detail_1”,
“link” : “https://xxxxx/yyy”
},
{
“detail” : “detail_2”,
“link” : “https://xxxxx/zzz”
}
],
“name” : “xyz”
}

Quiero obtener el “name” de todos los otros documentos donde details_list (que es una lista de diccionarios en sí misma) coincide con cualquier otro documento en la misma colección.

Intenté usar la cláusula $where también. db.collection.find({“$where”: details_list == details_list}) pero no devolvió ningún valor.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener el “nombre” de todos los demás documentos donde details_list coincide con cualquier otro documento en la misma colección, puedes utilizar el marco de agregación en MongoDB.

    Aquí tienes un ejemplo de consulta que recupera el campo “nombre” para los documentos que tienen al menos un detalle coincidente en su array details_list:

    db.collection.aggregate([
      {
        $unwind: "$details_list" // desagrupar el array details_list
      },
      {
        $group: {
          _id: "$details_list.detail", // agrupar por el campo detail
          names: { $addToSet: "$name" } // agregar los nombres a un array
        }
      },
      {
        $match: {
          "names.1": { $exists: true } // filtrar los documentos con solo un nombre
        }
      },
      {
        $project: {
          _id: 0,
          names: 1 // mostrar solo el array de nombres
        }
      }
    ])
    

    Esta consulta primero desagrupa el array details_list y agrupa los documentos por el campo “detail”. Luego agrega los nombres de los documentos coincidentes a un array. La etapa $match filtra los documentos que tienen solo un nombre en su array, ya que solo estamos interesados en aquellos documentos que tienen detalles coincidentes con otros documentos. Por último, la etapa $project muestra solo el array de nombres.

    Esta consulta debería devolver un array de objetos, donde cada objeto contiene un array de nombres que pertenecen a documentos con detalles coincidentes.

Comments are closed.