Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

145
Views
MongoDB suma de campos dentro de objetos dentro de una matriz que está dentro de un objeto mayor que x

//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 on
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

En 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 }
over 4 years ago · Santiago Trujillo Report

0

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" } } } ])
over 4 years ago · Santiago Trujillo Report

0

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" } } } }

Patio de recreo


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" } } } ])

Patio de recreo

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!