Tengo una colección de documentos ChatRooms en MongoDB que tiene esta estructura (simplificada):
{ _id: ObjectId('4654'), messages: [ { user: ObjectId('1234'), sentAt: ISODate('2022-03-01T00:00:00.000Z') }, { user: ObjectId('1234'), sentAt: ISODate('2022-03-02T00:00:00.000Z') }, { user: ObjectId('8888'), sentAt: ISODate('2022-03-03T00:00:00.000Z') }, ] } Lo que estoy tratando de lograr es filtrar la matriz de messages dentro de la canalización aggregate para obtener una matriz donde el userId de usuario se presente solo una vez. El resultado que busco es (o algo similar, pero la matriz no debería tener dos elementos con la misma identificación de user ):
{ _id: ObjectId('4654'), messages: [ { user: ObjectId('1234'), sentAt: ISODate('2022-03-01T00:00:00.000Z') }, { user: ObjectId('8888'), sentAt: ISODate('2022-03-03T00:00:00.000Z') }, ] }¿Es tal cosa posible incluso? Cualquier ayuda sería muy apreciada.
Puede hacer esto de varias maneras diferentes, aquí hay un ejemplo de cómo lograr esto usando el operador $reduce :
db.collection.aggregate([ { $addFields: { messages: { $reduce: { input: "$messages", initialValue: [], in: { $cond: [ { $in: [ "$$this.user", "$$value.user" ] }, "$$value", { "$concatArrays": [ "$$value", [ "$$this" ] ] } ] } } } } } ])