No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripción 🔥

Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

3D
2H
29M
34S

Relaciones 1 a muchos referenciadas

16/22
Recursos

Aportes 6

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

pipeline => Permite omitir campos del otro documento que no quiero traer, es de buen uso cuando por ejemplo quiero traer una order y usuario, pero por seguridad no retornar el password del usuario.

db.inventory2.aggregate([
    {
        $match: ObjectId('12e21j321321') 
    },
    {
        $lookup: {
            pipeline: [
                {$project: {identification_number: 0, password: 0, createdAt: 0, updatedAt: 0, token: 0}},
            ],
            from :'inventory1',
            localField: 'iduser',
            foreignField: 'iduser',
            as: 'detail'
        }
    },
    {
        $unwind: '$detail'
    }
])

Solucion al reto 😄
en $match: el id del user que quiero consultar

db.users.aggregate([
    {
        $match: {
          _id: ObjectId('63c1656be362e371c8e95a45')
        }
    },
    {
        $lookup: {
          from: 'orders', 
          localField: '_id', 
          foreignField: 'user_id', 
          as: 'order'
        }
    }
])

Es importante no abusar del uso del $lookup, sobre todo cuando tienen muchos (miles o millones) de documentos y se quieren sacar datos de varias otras collecciones. Ahi la performance de aggregate se reduce bastante.

Me gusta tu curso, pero hubiese sido más facil de explicar poniendo un caso con un ID fijo en lugar del ObjectID, sinceramente me he perdido.

Muestra las ordenes de cada usuario segun el id dado en el $match

Usando projection en ambas colecciones

use("platzi_store")

// muestra todas las ordenes de un usuario
//omitiendo la 'password', y el 'user_id' de referencia de cada orden
db.users.aggregate([
  {
    $match: {
      _id: ObjectId('63dc480941d8383c5926809e')
    }
  },
  {    
    /**
     * from: The target collection.
     * localField: The local join field.
     * foreignField: The target join field.
     * as: The name for the results.
     * pipeline: Optional pipeline to run on the foreign collection.
     * let: Optional variables to use in the pipeline field stages.
     */
    $lookup: {
      from: 'orders',
      localField: '_id',
      foreignField: 'user_id',
      as: 'orders_list',
      pipeline: [ //Aqui podemos hacer operaciones para la colección secundaria
        {
          /**
           * specifications: The fields to
           *   include or exclude.
           */
          $project: {
            'user_id': 0, // de la colección [orders]
          }
        }
      ],
    }
  },
  {
    /**
     * specifications: The fields to
     *   include or exclude.
     */
    $project: {
      'password': 0, //de la colección [users]
    }
  }
])

Resultado

[
  {
    "_id": {
      "$oid": "63dc480941d8383c5926809e"
    },
    "email": "[email protected]",
    "role": "admin",
    "social_accounts": [
      "twitter",
      "Facebook"
    ],
    "address": {
      "street": "cc 891",
      "city": "Bogota",
      "zip": "11011"
    },
    "shipping_adres": {
      "street": "cc 2342",
      "city": "Bogota",
      "zip": "22022"
    },
    "orders_list": [
      {
        "_id": {
          "$oid": "63dc5ccc617a08ee3ec6c213"
        },
        "date": "Thu Feb 02 2023 22:01:00 GMT-0300 (Brasilia Standard Time)",
        "item": [
          {
            "name": "camiseta",
            "price": 120,
            "qty": 2
          },
          {
            "name": "jeans",
            "price": 300,
            "qty": 1
          },
          {
            "name": "gorra",
            "price": 50,
            "qty": 1
          }
        ]
      },
      {
        "_id": {
          "$oid": "63dc5f4ad9dbf4f7eb40655c"
        },
        "date": "Thu Feb 02 2023 22:11:38 GMT-0300 (Brasilia Standard Time)",
        "item": [
          {
            "name": "short",
            "price": 23,
            "qty": 2
          }
        ]
      }
    ]
  }
]

Al momento de consultar por 1:n o n:n desde el punto de vista de base de datos debemos hacer estas búsquedas completas, pero cuando estamos en un producto real, puede o no verse como las búsquedas que hace el profesor