Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

141
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda