Necesito encontrar la duración promedio de cada serie de terror.
Tengo dos colecciones Serie y Libros, los libros pertenecen a la serie y tienen una longitud de campo, la serie tiene un "género" de campo.
Serie
{ "_id": "61179c8d43400f31df195223", "name": "serie1", "book genre": Horror }, { "_id": "61179c8d43400f31df195223", "name": "serie2", "book genre": Romance }, { "_id": "61179c8d43400f31df195223", "name": "serie3", "book genre": Horror }, { "_id": "61179c8d43400f31df195223", "name": "serie4", "book genre": Horror },Libros
{ "_id": "61179c8d43400f31df195223", "name": "book1", "lenght": 100, "serie": "serie1" }, { "_id": "61179c8d43400f31df195223", "name": "book2", "lenght": 10, "serie": "serie3" }, { "_id": "61179c8d43400f31df195223", "name": "book3", "lenght": 900, "serie": "serie3" }, { "_id": "61179c8d43400f31df195223", "name": "book4", "lenght": 300, "serie": "serie1" },Puede hacer esto con una agregación bastante estándar, aquí estoy usando $lookup , $avg y $map para lograr los resultados finales:
db.series.aggregate([ { $lookup: { from: "books", localField: "name", foreignField: "serie", as: "books" } }, { $project: { _id: 1, name: 1, "book genre": 1, avg: { "$ifNull": [ { $avg: { $map: { input: "$books", in: "$$this.lenght" } } }, 0 ] } } } ])Consulta
*La respuesta de Toms encontró el promedio por serie, si no quieres eso, ¿quizás quieras esto? no estoy seguro. Ayudaría si nos enviara el resultado esperado, pensé que también quería lo que hizo Tom.
series.aggregate( [{"$group":{"_id":"$book genre", "series":{"$push":"$name"}}}, {"$lookup": {"from":"books", "localField":"series", "foreignField":"serie", "as":"series"}}, {"$set": {"book genre":"$_id", "_id":"$$REMOVE", "avgTime":{"$avg":"$series.lenght"}}}])