¿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.
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 campoowner
en la coleccióncontents
y el campo_id
en la colecciónprofiles
.Suponiendo que tiene la ID de perfil y desea filtrar la colección
contents
basándose en el campoblacklist
correspondiente de la colecciónprofiles
, el conjunto de etapas de agregación se vería algo así:Aquí, la etapa
$lookup
realiza una unión externa izquierda entre las coleccionescontents
yprofiles
basándose en los camposowner
y_id
, respectivamente. La opciónas
renombra el resultado del array de documentos que hacen juego de la colecciónprofiles
comoprofile
para mayor conveniencia.A continuación, la etapa
$match
filtra los resultados basándose en el campoblacklist
del arrayprofile
. Específicamente, el operador$nin
verifica que el valoranother_profile_id_here
no se encuentre en el arrayblacklist
.En general, este conjunto de etapas debería devolver todos los documentos de la colección
contents
en los cuales elowner
no está en la lista negra según el registro correspondiente en la colecciónprofiles
.