Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

146
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda