//8. isbn números de libros que vendieron al menos X copias (usted decide el valor de X).
ejemplo de libro
{ isbn: "0001", title: "Book1", pages: NumberInt("150"), price: NumberDecimal("321.2"), copies: NumberInt("3"), language: "english", author: ["Author1"], category: ["Space Opera"], genre: ["Genre-1", "Genre-2"], character: ["Character-1", "Character-2"], },Ejemplo de pedido
{ orderNo: "3", customerNo: "0003", date: { day: NumberInt("25"), month: NumberInt("02"), year: NumberInt("2021"), }, orderLine: [ { isbn: "0006", price: NumberDecimal("341.0"), amount: NumberInt("2"), }, { isbn: "0007", price: NumberDecimal("170.5"), amount: NumberInt("1"), }, ], },Mi intento Creo que tengo un error dentro de la tubería en la fase de grupos. Por ahora necesito al menos tener isbn junto con las copias vendidas en un solo objeto.
db.books.aggregate([ // editing this { $match : {} }, { $lookup : { from : "orders", pipeline : [ { $group : { _id: null, amount_total : { $sum : "$orderLine.amount" } } }, { $project : { _id : 0, amount_total : 1} } ], as : "amount" } }, { $project : { _id : 0, isbn : 1, amount : 1} } ])No tengo idea de por qué todos son 0, esperaba al menos algunos números diferentes.
{ "isbn": "0001", "amount": [ { "amount_total": 0 } ] }, { "isbn": "0002", "amount": [ { "amount_total": 0 } ] }, { "isbn": "0003", "amount": [ { "amount_total": 0 } ] },// and so onEn su consulta, $lookup está realizando una operación de combinación sin ninguna condición; en su lugar, intente esta consulta:
db.books.aggregate([ { $lookup: { from: "orders", let: { isbn: "$isbn" }, pipeline: [ { $unwind: "$orderLine" }, { $match: { $expr: { $eq: ["$orderLine.isbn", "$$isbn"] } } } ], as: "amount" } }, { $project: { _id: 0, isbn: 1, amount_total: { $sum: "$amount.orderLine.amount" } } } ]);Datos de prueba:
colección de books :
/* 1 createdAt:3/12/2021, 10:41:13 AM*/ { "_id" : ObjectId("604af7f14b5860176c2254b7"), "isbn" : "0001", "title" : "Book1" }, /* 2 createdAt:3/12/2021, 10:41:13 AM*/ { "_id" : ObjectId("604af7f14b5860176c2254b8"), "isbn" : "0002", "title" : "Book2" } recogida de orders :
/* 1 createdAt:3/12/2021, 11:10:51 AM*/ { "_id" : ObjectId("604afee34b5860176c2254ce"), "orderNo" : "1", "customerNo" : "0001", "orderLine" : [ { "isbn" : "0001", "price" : 341, "amount" : 2 }, { "isbn" : "0002", "price" : 170.5, "amount" : 1 }, { "isbn" : "0003", "price" : 190.5, "amount" : 3 } ] }, /* 2 createdAt:3/12/2021, 11:10:51 AM*/ { "_id" : ObjectId("604afee34b5860176c2254cf"), "orderNo" : "3", "customerNo" : "0003", "orderLine" : [ { "isbn" : "0001", "price" : 341, "amount" : 2 }, { "isbn" : "0002", "price" : 170.5, "amount" : 1 }, { "isbn" : "0003", "price" : 190.5, "amount" : 3 } ] }Producción:
/* 1 */ { "isbn" : "0001", "amount_total" : 4 }, /* 2 */ { "isbn" : "0002", "amount_total" : 2 }Aparentemente, esto hace lo que quería.
db.books.aggregate([ { $lookup: { from: "orders", let: { isbn: "$isbn" }, // Pass this variable to pipeline for Joining condition. pipeline: [ { $unwind: "$orderLine" }, { $match: { // Join condition. $expr: { $eq: ["$orderLine.isbn", "$$isbn"] } } }, { $project: { _id: 0 , orderNo : 1, "orderLine.amount": 1} } ], as: "amount" } }, { $project : { _id : 0, isbn : 1, amount_total : { $sum : "$amount.orderLine.amount" } } } ])La etapa $sum dentro $group sumará los campos raíz y agrupados, pero aquí el campo orderLine es una matriz, debe sumar esa matriz de números antes de aplicar $sum , lo que significa una operación $sum anidada,
{ $group: { _id: null, amount_total: { $sum: { $sum: "$orderLine.amount" } } } }Pruebe la solución final,
$match la matriz isbn en orderLine.isbn usando $in condición$filter para iterar el aspecto de la matriz orderLine y hacer coincidir isbn , devolverá documentos filtrados$let declare una variable de orders para mantener los documentos filtrados por encima de orderLine , sume la amount de la matriz filtrada usando $sum$project para mostrar los campos obligatorios y obtener la suma total de amount_total de cantidad_total db.books.aggregate([ { $lookup: { from: "orders", let: { isbn: "$isbn" }, pipeline: [ { $match: { $expr: { $in: ["$$isbn", "$orderLine.isbn"] } } }, { $project: { _id: 0, amount_total: { $let: { vars: { orders: { $filter: { input: "$orderLine", cond: { $eq: ["$$this.isbn", "$$isbn"] } } } }, in: { $sum: "$$orders.amount" } } } } } ], as: "amount" } }, { $project: { _id: 0, isbn: 1, amount_total: { $sum: "$amount.amount_total" } } } ])