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.

¿Agregar un nuevo campo en mongoDB desde otra colección de manera independiente?

Tengo dos colecciones: perfiles y contenidos

La colección perfiles se ve así:

{
  _id: ObjectId(''618ef65e5295ba3132c11111''),
  blacklist: [ObjectId(''618ef65e5295ba3132c33333''), ObjectId(''618ef65e5295ba3132c22222'')],
  //más campos
}

La colección contenidos se ve así:

{
  _id: ObjectId(''618ef65e5295ba3132c00000''),
  owner: ObjectId(''618ef65e5295ba3132c22222''),
  //más campos
}

Lo que necesito es obtener los contenidos en los que el owner no esté incluido en la blacklist. Pensé en agregar el campo blacklist en los documentos de contenidos. Podría obtener el perfil por ID por separado (en otra consulta) y establecerlo manualmente en la agregación en la que obtengo los contenidos, pero esto requiere una conexión extra.

Entonces mi pregunta es: ¿Hay alguna manera de agregar mi perfil en cada documento de otra colección? Tenga en cuenta que tengo el ID del perfil.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible agregar la información de una colección en cada documento de otra colección utilizando el Marco de Agregación de MongoDB. Específicamente, se puede utilizar la etapa $lookup para unir las dos colecciones basándose en un campo común, como el campo owner en la colección contents y el campo _id en la colección profiles.

    Suponiendo que tiene la ID de perfil y desea filtrar la colección contents basándose en el campo blacklist correspondiente de la colección profiles, el conjunto de etapas de agregación se vería algo así:

    db.contents.aggregate([
      {
        $lookup: {
          from: "profiles",
          localField: "owner",
          foreignField: "_id",
          as: "profile"
        }
      },
      {
        $match: {
          "profile.blacklist": {
            $nin: [ObjectId("another_profile_id_here")]
          }
        }
      }
    ])
    

    Aquí, la etapa $lookup realiza una unión externa izquierda entre las colecciones contents y profiles basándose en los campos owner y _id, respectivamente. La opción as renombra el resultado del array de documentos que hacen juego de la colección profiles como profile para mayor conveniencia.

    A continuación, la etapa $match filtra los resultados basándose en el campo blacklist del array profile. Específicamente, el operador $nin verifica que el valor another_profile_id_here no se encuentre en el array blacklist.

    En general, este conjunto de etapas debería devolver todos los documentos de la colección contents en los cuales el owner no está en la lista negra según el registro correspondiente en la colección profiles.

Comments are closed.